diff --git a/tools/llvm-ld/Makefile b/tools/llvm-ld/Makefile index dc8bffb742b..b22035b9315 100644 --- a/tools/llvm-ld/Makefile +++ b/tools/llvm-ld/Makefile @@ -10,7 +10,7 @@ LEVEL = ../.. TOOLNAME = llvm-ld -LINK_COMPONENTS = ipo scalaropts linker archive bcreader bcwriter +LINK_COMPONENTS = ipo scalaropts linker archive bcwriter bitwriter REQUIRES_EH := 1 include $(LEVEL)/Makefile.common diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp index 4be651b65de..2aa6d18350e 100644 --- a/tools/llvm-ld/llvm-ld.cpp +++ b/tools/llvm-ld/llvm-ld.cpp @@ -25,7 +25,7 @@ #include "llvm/System/Program.h" #include "llvm/Module.h" #include "llvm/PassManager.h" -#include "llvm/Bytecode/Reader.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Bytecode/Writer.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -33,6 +33,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Streams.h" #include "llvm/Support/SystemUtils.h" #include "llvm/System/Signals.h" @@ -40,6 +41,8 @@ #include using namespace llvm; +cl::opt Bitcode("bitcode"); + // Input/Output Options static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); @@ -224,8 +227,12 @@ void GenerateBytecode(Module* M, const std::string& FileName) { sys::RemoveFileOnSignal(sys::Path(FileName)); // Write it out - OStream L(Out); - WriteBytecodeToFile(M, L, !DisableCompression); + if (Bitcode) { + WriteBitcodeToFile(M, Out); + } else { + OStream L(Out); + WriteBytecodeToFile(M, L, !DisableCompression); + } // Close the bytecode file. Out.close(); @@ -547,7 +554,7 @@ int main(int argc, char **argv, char **envp) { args[2] = tmp_output.c_str(); args[3] = 0; if (0 == sys::Program::ExecuteAndWait(prog, args, 0,0,0,0, &ErrMsg)) { - if (tmp_output.isBytecodeFile()) { + if (tmp_output.isBytecodeFile() || tmp_output.isBitcodeFile()) { sys::Path target(RealBytecodeOutput); target.eraseFromDisk(); if (tmp_output.renamePathOnDisk(target, &ErrMsg))