diff --git a/emscripten-version.txt b/emscripten-version.txt index 29d93075197..6c1f3860487 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.34.4 +1.34.5 diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h index 343ab54bf03..9fc1d274a30 100644 --- a/lib/Target/JSBackend/CallHandlers.h +++ b/lib/Target/JSBackend/CallHandlers.h @@ -80,7 +80,7 @@ DEF_CALL_HANDLER(__default__, { Name = std::string("FUNCTION_TABLE_") + Sig + "[" + Name + " & #FM_" + Sig + "#]"; NeedCasts = false; // function table call, so stays in asm module } else { - Name = std::string("ftCall_") + Sig + "(" + getCast(Name, Type::getInt32Ty(CI->getContext())); + Name = std::string(Relocatable ? "mftCall_" : "ftCall_") + Sig + "(" + getCast(Name, Type::getInt32Ty(CI->getContext())); if (NumArgs > 0) Name += ','; Emulated = true; } diff --git a/lib/Transforms/NaCl/PromoteIntegers.cpp b/lib/Transforms/NaCl/PromoteIntegers.cpp index 13348ec1ec6..956d82e7f3b 100644 --- a/lib/Transforms/NaCl/PromoteIntegers.cpp +++ b/lib/Transforms/NaCl/PromoteIntegers.cpp @@ -635,7 +635,7 @@ static void convertInstruction(DataLayout *DL, Instruction *Inst, static bool processFunction(Function &F, DataLayout &DL) { ConversionState State; - bool Modified; + bool Modified = false; // XXX Emscripten: Fixed use of an uninitialized variable. for (auto FI = F.begin(), FE = F.end(); FI != FE; ++FI) { for (auto BBI = FI->begin(), BBE = FI->end(); BBI != BBE;) { Instruction *Inst = BBI++; diff --git a/tools/opt/CMakeLists.txt b/tools/opt/CMakeLists.txt index 0d834c9413a..cddfe9e67b7 100644 --- a/tools/opt/CMakeLists.txt +++ b/tools/opt/CMakeLists.txt @@ -7,6 +7,7 @@ set(LLVM_LINK_COMPONENTS IPA IPO IRReader + Linker # @LOCALMOD-BEGIN NaClAnalysis NaClBitWriter diff --git a/tools/opt/LLVMBuild.txt b/tools/opt/LLVMBuild.txt index cd2e4156fc7..03f20b75abe 100644 --- a/tools/opt/LLVMBuild.txt +++ b/tools/opt/LLVMBuild.txt @@ -19,4 +19,4 @@ type = Tool name = opt parent = Tools -required_libraries = NaClBitWriter NaClTransforms NaClAnalysis MinSFITransforms AsmParser BitReader BitWriter CodeGen IRReader IPO Instrumentation Scalar ObjCARC Passes all-targets +required_libraries = NaClBitWriter NaClTransforms NaClAnalysis MinSFITransforms AsmParser BitReader BitWriter CodeGen IRReader IPO Instrumentation Linker Scalar ObjCARC Passes all-targets diff --git a/tools/opt/Makefile b/tools/opt/Makefile index 3cc54cccb6d..20737abb51f 100644 --- a/tools/opt/Makefile +++ b/tools/opt/Makefile @@ -9,7 +9,7 @@ LEVEL := ../.. TOOLNAME := opt -LINK_COMPONENTS := naclbitwriter nacltransforms naclanalysis minsfitransforms jsbackend bitreader bitwriter asmparser irreader instrumentation scalaropts objcarcopts ipo vectorize all-targets codegen passes +LINK_COMPONENTS := naclbitwriter nacltransforms naclanalysis minsfitransforms jsbackend bitreader bitwriter asmparser irreader instrumentation scalaropts objcarcopts ipo vectorize all-targets codegen passes linker # Support plugins. NO_DEAD_STRIP := 1 diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index 5ae2322888b..18221607e8d 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -34,6 +34,7 @@ #include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" #include "llvm/InitializePasses.h" +#include "llvm/Linker/Linker.h" #include "llvm/LinkAllIR.h" #include "llvm/LinkAllPasses.h" #include "llvm/MC/SubtargetFeature.h" @@ -76,9 +77,9 @@ static cl::opt PassPipeline( // Other command line options... // -static cl::opt -InputFilename(cl::Positional, cl::desc(""), - cl::init("-"), cl::value_desc("filename")); +static cl::list // XXX EMSCRIPTEN: support multiple input files, link them +InputFilenames(cl::Positional, cl::ZeroOrMore, + cl::desc("")); static cl::opt OutputFilename("o", cl::desc("Override output filename"), @@ -462,7 +463,40 @@ int main(int argc, char **argv) { SMDiagnostic Err; // Load the input module... - std::unique_ptr M = parseIRFile(InputFilename, Err, Context); + std::unique_ptr M; + + // XXX EMSCRIPTEN: support for multiple files + if (InputFilenames.size() == 0) + M = parseIRFile("-", Err, Context); + else if (InputFilenames.size() == 1) + M = parseIRFile(InputFilenames[0], Err, Context); + else { + // link them in + M = nullptr; + std::unique_ptr L; + + for (unsigned i = 0; i < InputFilenames.size(); ++i) { + std::unique_ptr MM = parseIRFile(InputFilenames[i], Err, Context); + if (!MM.get()) { + errs() << argv[0] << ": error loading file '" <(M.get()); + } else { + if (L->linkInModule(MM.get())) + return 1; + } + } + } if (!M) { Err.print(argv[0], errs()); @@ -477,7 +511,7 @@ int main(int argc, char **argv) { // pass pipelines. Otherwise we can crash on broken code during // doInitialization(). if (!NoVerify && verifyModule(*M, &errs())) { - errs() << argv[0] << ": " << InputFilename + errs() << argv[0] << ": " << ": error: input module is broken!\n"; return 1; }