COFF: Initial implementation of link-time optimization.
This implementation is known to work in very simple cases (see new test case).
Differential Revision: http://reviews.llvm.org/D10115
llvm-svn: 238777
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 038b80f..e2a597a 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -12,6 +12,7 @@
#include "InputFiles.h"
#include "Writer.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/LTO/LTOModule.h"
#include "llvm/Object/COFF.h"
#include "llvm/Support/COFF.h"
#include "llvm/Support/Debug.h"
@@ -239,5 +240,32 @@
return std::error_code();
}
+std::error_code BitcodeFile::parse() {
+ std::string Err;
+ if (!Filename.empty()) {
+ M.reset(LTOModule::createFromFile(Filename.c_str(), llvm::TargetOptions(),
+ Err));
+ } else {
+ M.reset(LTOModule::createFromBuffer(MBRef.getBufferStart(),
+ MBRef.getBufferSize(),
+ llvm::TargetOptions(), Err));
+ }
+ if (!Err.empty()) {
+ llvm::errs() << Err << '\n';
+ return make_error_code(LLDError::BrokenFile);
+ }
+
+ for (unsigned I = 0, E = M->getSymbolCount(); I != E; ++I) {
+ StringRef SymName = M->getSymbolName(I);
+ if ((M->getSymbolAttributes(I) & LTO_SYMBOL_DEFINITION_MASK) ==
+ LTO_SYMBOL_DEFINITION_UNDEFINED) {
+ SymbolBodies.push_back(new (Alloc) Undefined(SymName));
+ } else {
+ SymbolBodies.push_back(new (Alloc) DefinedBitcode(SymName));
+ }
+ }
+
+ return std::error_code();
+}
} // namespace coff
} // namespace lld