summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/SymbolicFile.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-09-18 21:28:49 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-09-18 21:28:49 +0000
commit10039c02ea1d34d39fb3b66f522c53bb50751da5 (patch)
treed0fcaa82f000b5ef6f140be711ae02155192c4fd /llvm/lib/Object/SymbolicFile.cpp
parent6bf091c656f319e36721364fe50c456efca36df6 (diff)
downloadbcm5719-llvm-10039c02ea1d34d39fb3b66f522c53bb50751da5.tar.gz
bcm5719-llvm-10039c02ea1d34d39fb3b66f522c53bb50751da5.zip
LTO: introduce object file-based on-disk module format.
This format is simply a regular object file with the bitcode stored in a section named ".llvmbc", plus any number of other (non-allocated) sections. One immediate use case for this is to accommodate compilation processes which expect the object file to contain metadata in non-allocated sections, such as the ".go_export" section used by some Go compilers [1], although I imagine that in the future we could consider compiling parts of the module (such as large non-inlinable functions) directly into the object file to improve LTO efficiency. [1] http://golang.org/doc/install/gccgo#Imports Differential Revision: http://reviews.llvm.org/D4371 llvm-svn: 218078
Diffstat (limited to 'llvm/lib/Object/SymbolicFile.cpp')
-rw-r--r--llvm/lib/Object/SymbolicFile.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Object/SymbolicFile.cpp b/llvm/lib/Object/SymbolicFile.cpp
index f8dd4b33a39..9dfb09dbeca 100644
--- a/llvm/lib/Object/SymbolicFile.cpp
+++ b/llvm/lib/Object/SymbolicFile.cpp
@@ -40,11 +40,9 @@ ErrorOr<std::unique_ptr<SymbolicFile>> SymbolicFile::createSymbolicFile(
case sys::fs::file_magic::macho_universal_binary:
case sys::fs::file_magic::windows_resource:
return object_error::invalid_file_type;
- case sys::fs::file_magic::elf_relocatable:
case sys::fs::file_magic::elf_executable:
case sys::fs::file_magic::elf_shared_object:
case sys::fs::file_magic::elf_core:
- case sys::fs::file_magic::macho_object:
case sys::fs::file_magic::macho_executable:
case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
case sys::fs::file_magic::macho_core:
@@ -54,10 +52,26 @@ ErrorOr<std::unique_ptr<SymbolicFile>> SymbolicFile::createSymbolicFile(
case sys::fs::file_magic::macho_bundle:
case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
case sys::fs::file_magic::macho_dsym_companion:
- case sys::fs::file_magic::coff_object:
case sys::fs::file_magic::coff_import_library:
case sys::fs::file_magic::pecoff_executable:
return ObjectFile::createObjectFile(Object, Type);
+ case sys::fs::file_magic::elf_relocatable:
+ case sys::fs::file_magic::macho_object:
+ case sys::fs::file_magic::coff_object: {
+ ErrorOr<std::unique_ptr<ObjectFile>> Obj =
+ ObjectFile::createObjectFile(Object, Type);
+ if (!Obj || !Context)
+ return std::move(Obj);
+
+ ErrorOr<MemoryBufferRef> BCData =
+ IRObjectFile::findBitcodeInObject(*Obj->get());
+ if (!BCData)
+ return std::move(Obj);
+
+ return IRObjectFile::createIRObjectFile(
+ MemoryBufferRef(BCData->getBuffer(), Object.getBufferIdentifier()),
+ *Context);
+ }
}
llvm_unreachable("Unexpected Binary File Type");
}
OpenPOWER on IntegriCloud