//===- lib/ReaderWriter/ELF/ExecutableAtoms.h -----------------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_EXECUTABLE_ATOM_H #define LLD_READER_WRITER_ELF_EXECUTABLE_ATOM_H #include "Atoms.h" #include "File.h" #include "lld/Core/DefinedAtom.h" #include "lld/Core/File.h" #include "lld/Core/Reference.h" #include "lld/Core/UndefinedAtom.h" #include "lld/ReaderWriter/Writer.h" namespace lld { namespace elf { /// \brief All atoms are owned by a File. To add linker specific atoms /// the atoms need to be inserted to a file called (CRuntimeFile) which /// are basically additional symbols required by libc and other runtime /// libraries part of executing a program. This class provides support /// for adding absolute symbols and undefined symbols template class CRuntimeFile : public ELFFile { public: typedef llvm::object::Elf_Sym_Impl Elf_Sym; CRuntimeFile(const ELFTargetInfo &ti, StringRef name = "C runtime") : ELFFile(ti, name) {} /// \brief add a global absolute atom virtual void addAbsoluteAtom(StringRef symbolName) { Elf_Sym *symbol = new (_allocator.Allocate()) Elf_Sym; symbol->st_name = 0; symbol->st_value = 0; symbol->st_shndx = llvm::ELF::SHN_ABS; symbol->setBindingAndType(llvm::ELF::STB_GLOBAL, llvm::ELF::STT_OBJECT); symbol->st_other = llvm::ELF::STV_DEFAULT; symbol->st_size = 0; auto *newAtom = new (_allocator) ELFAbsoluteAtom(*this, symbolName, symbol, -1); _absoluteAtoms._atoms.push_back(newAtom); } /// \brief add an undefined atom virtual void addUndefinedAtom(StringRef symbolName) { assert(!symbolName.empty() && "UndefinedAtoms must have a name"); Elf_Sym *symbol = new (_allocator) Elf_Sym; symbol->st_name = 0; symbol->st_value = 0; symbol->st_shndx = llvm::ELF::SHN_UNDEF; symbol->st_other = llvm::ELF::STV_DEFAULT; symbol->st_size = 0; auto *newAtom = new (_allocator) ELFUndefinedAtom(*this, symbolName, symbol); _undefinedAtoms._atoms.push_back(newAtom); } virtual const File::atom_collection &defined() const { return _definedAtoms; } virtual const File::atom_collection &undefined() const { return _undefinedAtoms; } virtual const File::atom_collection &sharedLibrary() const { return _sharedLibraryAtoms; } virtual const File::atom_collection &absolute() const { return _absoluteAtoms; } // cannot add atoms to C Runtime file virtual void addAtom(const Atom &) { llvm_unreachable("cannot add atoms to Runtime files"); } protected: llvm::BumpPtrAllocator _allocator; File::atom_collection_vector _definedAtoms; File::atom_collection_vector _undefinedAtoms; File::atom_collection_vector _sharedLibraryAtoms; File::atom_collection_vector _absoluteAtoms; }; } // end namespace elf } // end namespace lld #endif