//===- ConcatOutputSection.h ------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLD_MACHO_CONCAT_OUTPUT_SECTION_H #define LLD_MACHO_CONCAT_OUTPUT_SECTION_H #include "InputSection.h" #include "OutputSection.h" #include "lld/Common/LLVM.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" namespace lld::macho { class Defined; // Linking multiple files will inevitably mean resolving sections in different // files that are labeled with the same segment and section name. This class // contains all such sections and writes the data from each section sequentially // in the final binary. class ConcatOutputSection : public OutputSection { … }; // ConcatOutputSections that contain code (text) require special handling to // support thunk insertion. class TextOutputSection : public ConcatOutputSection { … }; // We maintain one ThunkInfo per real function. // // The "active thunk" is represented by the sym/isec pair that // turns-over during finalize(): as the call-site address advances, // the active thunk goes out of branch-range, and we create a new // thunk to take its place. // // The remaining members -- bools and counters -- apply to the // collection of thunks associated with the real function. struct ThunkInfo { … }; NamePair maybeRenameSection(NamePair key); // Output sections are added to output segments in iteration order // of ConcatOutputSection, so must have deterministic iteration order. extern llvm::MapVector<NamePair, ConcatOutputSection *> concatOutputSections; extern llvm::DenseMap<Symbol *, ThunkInfo> thunkMap; } // namespace lld::macho #endif