//===- InputSection.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_ELF_INPUT_SECTION_H #define LLD_ELF_INPUT_SECTION_H #include "Config.h" #include "Relocations.h" #include "lld/Common/CommonLinkerContext.h" #include "lld/Common/LLVM.h" #include "lld/Common/Memory.h" #include "llvm/ADT/CachedHashString.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/TinyPtrVector.h" #include "llvm/Object/ELF.h" #include "llvm/Support/Compiler.h" namespace lld { namespace elf { class InputFile; class Symbol; class Defined; struct Partition; class SyntheticSection; template <class ELFT> class ObjFile; class OutputSection; LLVM_LIBRARY_VISIBILITY extern std::vector<Partition> partitions; // Returned by InputSectionBase::relsOrRelas. At most one member is empty. template <class ELFT> struct RelsOrRelas { … }; #define invokeOnRelocs(sec, f, ...) … // This is the base class of all sections that lld handles. Some are sections in // input files, some are sections in the produced output file and some exist // just as a convenience for implementing special ways of combining some // sections. class SectionBase { … }; struct SymbolAnchor { … }; struct RelaxAux { … }; // This corresponds to a section of an input file. class InputSectionBase : public SectionBase { … }; // SectionPiece represents a piece of splittable section contents. // We allocate a lot of these and binary search on them. This means that they // have to be as compact as possible, which is why we don't store the size (can // be found by looking at the next one). struct SectionPiece { … }; static_assert …; // This corresponds to a SHF_MERGE section of an input file. class MergeInputSection : public InputSectionBase { … }; struct EhSectionPiece { … }; // This corresponds to a .eh_frame section of an input file. class EhInputSection : public InputSectionBase { … }; // This is a section that is added directly to an output section // instead of needing special combination via a synthetic section. This // includes all input sections with the exceptions of SHF_MERGE and // .eh_frame. It also includes the synthetic sections themselves. class InputSection : public InputSectionBase { … }; // A marker for a potential spill location for another input section. This // broadly acts as if it were the original section until address assignment. // Then it is either replaced with the real input section or removed. class PotentialSpillSection : public InputSection { … }; static_assert …; class SyntheticSection : public InputSection { … }; inline bool isStaticRelSecType(uint32_t type) { … } inline bool isDebugSection(const InputSectionBase &sec) { … } } // namespace elf std::string toString(const elf::InputSectionBase *); } // namespace lld #endif