diff options
author | Jez Ng <jezng@fb.com> | 2020-12-01 19:57:37 -0800 |
---|---|---|
committer | Jez Ng <jezng@fb.com> | 2020-12-08 10:34:32 -0800 |
commit | 7b007ac0800babe750c58b1aead15e1c3e7f3b0f (patch) | |
tree | cde2502be70ca11ca091c8b5bf6582644b42ffa1 /lld/MachO | |
parent | 94e645f9cce8fba26b4aec069103794f1779065f (diff) | |
download | llvm-project-7b007ac0800babe750c58b1aead15e1c3e7f3b0f.tar.gz |
[lld-macho][nfc] Move some methods from InputFile to ObjFile
Additionally:
1. Move the helper functions in InputSection.h below the definition of
`InputSection`, so the important stuff is on top
2. Remove unnecessary `explicit`
Reviewed By: #lld-macho, compnerd
Differential Revision: https://reviews.llvm.org/D92453
Diffstat (limited to 'lld/MachO')
-rw-r--r-- | lld/MachO/InputFiles.cpp | 14 | ||||
-rw-r--r-- | lld/MachO/InputFiles.h | 21 | ||||
-rw-r--r-- | lld/MachO/InputSection.cpp | 4 | ||||
-rw-r--r-- | lld/MachO/InputSection.h | 32 |
4 files changed, 34 insertions, 37 deletions
diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp index 1339152901ce..24600090c491 100644 --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -155,7 +155,7 @@ const load_command *macho::findCommand(const mach_header_64 *hdr, return nullptr; } -void InputFile::parseSections(ArrayRef<section_64> sections) { +void ObjFile::parseSections(ArrayRef<section_64> sections) { subsections.reserve(sections.size()); auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart()); @@ -192,8 +192,8 @@ static InputSection *findContainingSubsection(SubsectionMap &map, return it->second; } -void InputFile::parseRelocations(const section_64 &sec, - SubsectionMap &subsecMap) { +void ObjFile::parseRelocations(const section_64 &sec, + SubsectionMap &subsecMap) { auto *buf = reinterpret_cast<const uint8_t *>(mb.getBufferStart()); ArrayRef<any_relocation_info> anyRelInfos( reinterpret_cast<const any_relocation_info *>(buf + sec.reloff), @@ -266,8 +266,8 @@ static macho::Symbol *createAbsolute(const structs::nlist_64 &sym, /*isExternal=*/false); } -macho::Symbol *InputFile::parseNonSectionSymbol(const structs::nlist_64 &sym, - StringRef name) { +macho::Symbol *ObjFile::parseNonSectionSymbol(const structs::nlist_64 &sym, + StringRef name) { uint8_t type = sym.n_type & N_TYPE; switch (type) { case N_UNDF: @@ -289,8 +289,8 @@ macho::Symbol *InputFile::parseNonSectionSymbol(const structs::nlist_64 &sym, } } -void InputFile::parseSymbols(ArrayRef<structs::nlist_64> nList, - const char *strtab, bool subsectionsViaSymbols) { +void ObjFile::parseSymbols(ArrayRef<structs::nlist_64> nList, + const char *strtab, bool subsectionsViaSymbols) { // resize(), not reserve(), because we are going to create N_ALT_ENTRY symbols // out-of-sequence. symbols.resize(nList.size()); diff --git a/lld/MachO/InputFiles.h b/lld/MachO/InputFiles.h index 59638ac197cf..877ccaef2fef 100644 --- a/lld/MachO/InputFiles.h +++ b/lld/MachO/InputFiles.h @@ -64,7 +64,6 @@ public: MemoryBufferRef mb; std::vector<Symbol *> symbols; - ArrayRef<llvm::MachO::section_64> sectionHeaders; std::vector<SubsectionMap> subsections; // Provides an easy way to sort InputFiles deterministically. const int id; @@ -80,15 +79,6 @@ protected: InputFile(Kind kind, const llvm::MachO::InterfaceFile &interface) : id(idCount++), fileKind(kind), name(saver.save(interface.getPath())) {} - void parseSections(ArrayRef<llvm::MachO::section_64>); - - void parseSymbols(ArrayRef<lld::structs::nlist_64> nList, const char *strtab, - bool subsectionsViaSymbols); - - Symbol *parseNonSectionSymbol(const structs::nlist_64 &sym, StringRef name); - - void parseRelocations(const llvm::MachO::section_64 &, SubsectionMap &); - private: const Kind fileKind; const StringRef name; @@ -99,21 +89,26 @@ private: // .o file class ObjFile : public InputFile { public: - explicit ObjFile(MemoryBufferRef mb, uint32_t modTime, StringRef archiveName); + ObjFile(MemoryBufferRef mb, uint32_t modTime, StringRef archiveName); static bool classof(const InputFile *f) { return f->kind() == ObjKind; } llvm::DWARFUnit *compileUnit = nullptr; const uint32_t modTime; + ArrayRef<llvm::MachO::section_64> sectionHeaders; private: + void parseSections(ArrayRef<llvm::MachO::section_64>); + void parseSymbols(ArrayRef<lld::structs::nlist_64> nList, const char *strtab, + bool subsectionsViaSymbols); + Symbol *parseNonSectionSymbol(const structs::nlist_64 &sym, StringRef name); + void parseRelocations(const llvm::MachO::section_64 &, SubsectionMap &); void parseDebugInfo(); }; // command-line -sectcreate file class OpaqueFile : public InputFile { public: - explicit OpaqueFile(MemoryBufferRef mb, StringRef segName, - StringRef sectName); + OpaqueFile(MemoryBufferRef mb, StringRef segName, StringRef sectName); static bool classof(const InputFile *f) { return f->kind() == OpaqueKind; } }; diff --git a/lld/MachO/InputSection.cpp b/lld/MachO/InputSection.cpp index 80c263301f41..8477d78d2f3f 100644 --- a/lld/MachO/InputSection.cpp +++ b/lld/MachO/InputSection.cpp @@ -26,6 +26,10 @@ uint64_t InputSection::getFileOffset() const { return parent->fileOff + outSecFileOff; } +uint64_t InputSection::getFileSize() const { + return isZeroFill(flags) ? 0 : getSize(); +} + uint64_t InputSection::getVA() const { return parent->addr + outSecOff; } void InputSection::writeTo(uint8_t *buf) { diff --git a/lld/MachO/InputSection.h b/lld/MachO/InputSection.h index f405fd6cf6d3..5829936ece29 100644 --- a/lld/MachO/InputSection.h +++ b/lld/MachO/InputSection.h @@ -35,27 +35,11 @@ struct Reloc { llvm::PointerUnion<Symbol *, InputSection *> referent; }; -inline bool isZeroFill(uint32_t flags) { - return llvm::MachO::isVirtualSection(flags & llvm::MachO::SECTION_TYPE); -} - -inline bool isThreadLocalVariables(uint32_t flags) { - return (flags & llvm::MachO::SECTION_TYPE) == - llvm::MachO::S_THREAD_LOCAL_VARIABLES; -} - -inline bool isDebugSection(uint32_t flags) { - return (flags & llvm::MachO::SECTION_ATTRIBUTES_USR) == - llvm::MachO::S_ATTR_DEBUG; -} - class InputSection { public: virtual ~InputSection() = default; virtual uint64_t getSize() const { return data.size(); } - virtual uint64_t getFileSize() const { - return isZeroFill(flags) ? 0 : getSize(); - } + virtual uint64_t getFileSize() const; uint64_t getFileOffset() const; uint64_t getVA() const; @@ -76,6 +60,20 @@ public: std::vector<Reloc> relocs; }; +inline bool isZeroFill(uint32_t flags) { + return llvm::MachO::isVirtualSection(flags & llvm::MachO::SECTION_TYPE); +} + +inline bool isThreadLocalVariables(uint32_t flags) { + return (flags & llvm::MachO::SECTION_TYPE) == + llvm::MachO::S_THREAD_LOCAL_VARIABLES; +} + +inline bool isDebugSection(uint32_t flags) { + return (flags & llvm::MachO::SECTION_ATTRIBUTES_USR) == + llvm::MachO::S_ATTR_DEBUG; +} + bool isCodeSection(InputSection *); extern std::vector<InputSection *> inputSections; |