diff options
| -rw-r--r-- | llvm/docs/BitCodeFormat.rst | 9 | ||||
| -rw-r--r-- | llvm/include/llvm/Object/MachO.h | 1 | ||||
| -rw-r--r-- | llvm/include/llvm/Object/ObjectFile.h | 7 | ||||
| -rw-r--r-- | llvm/lib/Object/FunctionIndexObjectFile.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Object/IRObjectFile.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Object/ObjectFile.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/LTO/X86/Inputs/bcsection.macho.s | 5 |
8 files changed, 34 insertions, 13 deletions
diff --git a/llvm/docs/BitCodeFormat.rst b/llvm/docs/BitCodeFormat.rst index d6e3099bdb6..f6a560df8df 100644 --- a/llvm/docs/BitCodeFormat.rst +++ b/llvm/docs/BitCodeFormat.rst @@ -467,10 +467,11 @@ Native Object File Wrapper Format ================================= Bitcode files for LLVM IR may also be wrapped in a native object file -(i.e. ELF, COFF, Mach-O). The bitcode must be stored in a section of the -object file named ``.llvmbc``. This wrapper format is useful for accommodating -LTO in compilation pipelines where intermediate objects must be native object -files which contain metadata in other sections. +(i.e. ELF, COFF, Mach-O). The bitcode must be stored in a section of the object +file named ``__LLVM,__bitcode`` for MachO and ``.llvmbc`` for the other object +formats. This wrapper format is useful for accommodating LTO in compilation +pipelines where intermediate objects must be native object files which contain +metadata in other sections. Not all tools support this format. diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index e02ce3b2141..252d47d3c4c 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -226,6 +226,7 @@ public: bool isSectionData(DataRefImpl Sec) const override; bool isSectionBSS(DataRefImpl Sec) const override; bool isSectionVirtual(DataRefImpl Sec) const override; + bool isSectionBitcode(DataRefImpl Sec) const override; relocation_iterator section_rel_begin(DataRefImpl Sec) const override; relocation_iterator section_rel_end(DataRefImpl Sec) const override; diff --git a/llvm/include/llvm/Object/ObjectFile.h b/llvm/include/llvm/Object/ObjectFile.h index ce0c891ee0c..6fe73855dca 100644 --- a/llvm/include/llvm/Object/ObjectFile.h +++ b/llvm/include/llvm/Object/ObjectFile.h @@ -94,6 +94,7 @@ public: bool isData() const; bool isBSS() const; bool isVirtual() const; + bool isBitcode() const; bool containsSymbol(SymbolRef S) const; @@ -219,6 +220,7 @@ protected: virtual bool isSectionBSS(DataRefImpl Sec) const = 0; // A section is 'virtual' if its contents aren't present in the object image. virtual bool isSectionVirtual(DataRefImpl Sec) const = 0; + virtual bool isSectionBitcode(DataRefImpl Sec) const; virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const = 0; virtual relocation_iterator section_rel_end(DataRefImpl Sec) const = 0; virtual section_iterator getRelocatedSection(DataRefImpl Sec) const; @@ -296,6 +298,7 @@ public: static ErrorOr<std::unique_ptr<MachOObjectFile>> createMachOObjectFile(MemoryBufferRef Object); + }; // Inline function definitions. @@ -394,6 +397,10 @@ inline bool SectionRef::isVirtual() const { return OwningObject->isSectionVirtual(SectionPimpl); } +inline bool SectionRef::isBitcode() const { + return OwningObject->isSectionBitcode(SectionPimpl); +} + inline relocation_iterator SectionRef::relocation_begin() const { return OwningObject->section_rel_begin(SectionPimpl); } diff --git a/llvm/lib/Object/FunctionIndexObjectFile.cpp b/llvm/lib/Object/FunctionIndexObjectFile.cpp index fe111de1a9c..927fd1409a6 100644 --- a/llvm/lib/Object/FunctionIndexObjectFile.cpp +++ b/llvm/lib/Object/FunctionIndexObjectFile.cpp @@ -35,10 +35,7 @@ std::unique_ptr<FunctionInfoIndex> FunctionIndexObjectFile::takeIndex() { ErrorOr<MemoryBufferRef> FunctionIndexObjectFile::findBitcodeInObject(const ObjectFile &Obj) { for (const SectionRef &Sec : Obj.sections()) { - StringRef SecName; - if (std::error_code EC = Sec.getName(SecName)) - return EC; - if (SecName == ".llvmbc") { + if (Sec.isBitcode()) { StringRef SecContents; if (std::error_code EC = Sec.getContents(SecContents)) return EC; diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 5548a3822b8..49737b5f6f9 100644 --- a/llvm/lib/Object/IRObjectFile.cpp +++ b/llvm/lib/Object/IRObjectFile.cpp @@ -266,10 +266,7 @@ basic_symbol_iterator IRObjectFile::symbol_end_impl() const { ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInObject(const ObjectFile &Obj) { for (const SectionRef &Sec : Obj.sections()) { - StringRef SecName; - if (std::error_code EC = Sec.getName(SecName)) - return EC; - if (SecName == ".llvmbc") { + if (Sec.isBitcode()) { StringRef SecContents; if (std::error_code EC = Sec.getContents(SecContents)) return EC; diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index ed0ca68653f..3a892d21db3 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -630,6 +630,14 @@ bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const { return false; } +bool MachOObjectFile::isSectionBitcode(DataRefImpl Sec) const { + StringRef SegmentName = getSectionFinalSegmentName(Sec); + StringRef SectName; + if (!getSectionName(Sec, SectName)) + return (SegmentName == "__LLVM" && SectName == "__bitcode"); + return false; +} + relocation_iterator MachOObjectFile::section_rel_begin(DataRefImpl Sec) const { DataRefImpl Ret; Ret.d.a = Sec.d.a; diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index d12dc411361..860cefa113c 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -55,6 +55,13 @@ std::error_code ObjectFile::printSymbolName(raw_ostream &OS, uint32_t ObjectFile::getSymbolAlignment(DataRefImpl DRI) const { return 0; } +bool ObjectFile::isSectionBitcode(DataRefImpl Sec) const { + StringRef SectName; + if (!getSectionName(Sec, SectName)) + return SectName == ".llvmbc"; + return false; +} + section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { return section_iterator(SectionRef(Sec, this)); } diff --git a/llvm/test/LTO/X86/Inputs/bcsection.macho.s b/llvm/test/LTO/X86/Inputs/bcsection.macho.s index cb7fe03b3e7..24884b5a913 100644 --- a/llvm/test/LTO/X86/Inputs/bcsection.macho.s +++ b/llvm/test/LTO/X86/Inputs/bcsection.macho.s @@ -1,2 +1,5 @@ -.section .llvmbc,.llvmbc +.section __FOO,__bitcode +.asciz "Wrong Section" + +.section __LLVM,__bitcode .incbin "bcsection.bc" |

