IceCompileServer.cpp revision c5bc5cb33580557062574416794244a09ba99130
144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung//===- subzero/src/IceCompileServer.cpp - Compile server ------------------===// 244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// 344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// The Subzero Code Generator 444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// 544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// This file is distributed under the University of Illinois Open Source 644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// License. See LICENSE.TXT for details. 744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung// 844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung//===----------------------------------------------------------------------===// 99612d32c7e5eb2cb403686ef31172d42e075e460Andrew Scull/// 109612d32c7e5eb2cb403686ef31172d42e075e460Andrew Scull/// \file 1192a6e5b08ec68e7076d637ebc680da2fcc346a00Jim Stichnoth/// \brief Defines the basic commandline-based compile server. 129612d32c7e5eb2cb403686ef31172d42e075e460Andrew Scull/// 1344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung//===----------------------------------------------------------------------===// 1444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 1567f8de9adf6439881a00d8e0f081918436c71f62John Porto#include "IceCompileServer.h" 1644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 1767f8de9adf6439881a00d8e0f081918436c71f62John Porto#include "IceClFlags.h" 1867f8de9adf6439881a00d8e0f081918436c71f62John Porto#include "IceELFStreamer.h" 1967f8de9adf6439881a00d8e0f081918436c71f62John Porto#include "IceGlobalContext.h" 204c16ac0f4f184128060f3b8c3db519f1a6293dfaDavid Sehr#include "LinuxMallocProfiling.h" 2198da96678bc2705d4a37e17b87bbb3c031be9ae0Jim Stichnoth 22b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth#ifdef __clang__ 2398da96678bc2705d4a37e17b87bbb3c031be9ae0Jim Stichnoth#pragma clang diagnostic push 2498da96678bc2705d4a37e17b87bbb3c031be9ae0Jim Stichnoth#pragma clang diagnostic ignored "-Wunused-parameter" 25b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth#endif // __clang__ 26b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth 276f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf#include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" 2844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung#include "llvm/Support/FileSystem.h" 2944c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung#include "llvm/Support/raw_os_ostream.h" 30b2d5084c573ef5de15eb0e87bdde5dfba59e524aJan Voung#include "llvm/Support/Signals.h" 3144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung#include "llvm/Support/SourceMgr.h" 3244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung#include "llvm/Support/StreamingMemoryObject.h" 33b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth 34b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth#ifdef __clang__ 3598da96678bc2705d4a37e17b87bbb3c031be9ae0Jim Stichnoth#pragma clang diagnostic pop 36b0051dfaca6e957fa62ab61c0ef2a42df7964d37Jim Stichnoth#endif // __clang__ 3744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 387e64eaaadcbd40c94deba3f03a571abfaa2fc086Karl Schimpf#include <cstdio> 3967f8de9adf6439881a00d8e0f081918436c71f62John Porto#include <fstream> 4067f8de9adf6439881a00d8e0f081918436c71f62John Porto#include <iostream> 4167f8de9adf6439881a00d8e0f081918436c71f62John Porto#include <thread> 4244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 4344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voungnamespace Ice { 4444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 4544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voungnamespace { 4644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 4757e126899b20c65ff3ea23a3b7d7a67ab30b99dcAndrew Scull// Define a SmallVector backed buffer as a data stream, so that it can hold the 4857e126899b20c65ff3ea23a3b7d7a67ab30b99dcAndrew Scull// generated binary version of the textual bitcode in the input file. 496f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpfclass TextDataStreamer : public llvm::DataStreamer { 506f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpfpublic: 516f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf TextDataStreamer() = default; 526f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf ~TextDataStreamer() final = default; 536f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf static TextDataStreamer *create(const IceString &Filename, std::string *Err); 546f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf size_t GetBytes(unsigned char *Buf, size_t Len) final; 5520b71f5890ee8651983b126c5978594a01e0af96Jim Stichnoth 566f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpfprivate: 576f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf llvm::SmallVector<char, 1024> BitcodeBuffer; 586f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf size_t Cursor = 0; 596f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf}; 606f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf 616f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl SchimpfTextDataStreamer *TextDataStreamer::create(const IceString &Filename, 626f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf std::string *Err) { 636f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf TextDataStreamer *Streamer = new TextDataStreamer(); 646f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf llvm::raw_string_ostream ErrStrm(*Err); 656f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf if (std::error_code EC = llvm::readNaClRecordTextAndBuildBitcode( 666f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf Filename, Streamer->BitcodeBuffer, &ErrStrm)) { 67cb6e95aac252a35c66705fb5e30d3c5e9ba4c1dcKarl Schimpf ErrStrm << EC.message(); 686f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf ErrStrm.flush(); 696f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf delete Streamer; 706f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf return nullptr; 716f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf } 72cb6e95aac252a35c66705fb5e30d3c5e9ba4c1dcKarl Schimpf ErrStrm.flush(); 736f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf return Streamer; 746f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf} 756f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf 766f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpfsize_t TextDataStreamer::GetBytes(unsigned char *Buf, size_t Len) { 776f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf if (Cursor >= BitcodeBuffer.size()) 786f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf return 0; 796f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf size_t Remaining = BitcodeBuffer.size(); 806f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf Len = std::min(Len, Remaining); 816f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf for (size_t i = 0; i < Len; ++i) 826f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf Buf[i] = BitcodeBuffer[Cursor + i]; 836f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf Cursor += Len; 846f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf return Len; 856f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf} 866f9ba115f546d0e3446f08bd6f4477d2b5645bd5Karl Schimpf 87620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnothstd::unique_ptr<Ostream> makeStream(const IceString &Filename, 88620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth std::error_code &EC) { 89620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth if (Filename == "-") { 9044c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cout)); 91620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth } else { 92620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth return std::unique_ptr<Ostream>( 93620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); 9444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 9544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung} 9644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 9798ba00666271be1bdcd45b72b3dec04419efe61bJim StichnothErrorCodes getReturnValue(ErrorCodes Val) { 98c5bc5cb33580557062574416794244a09ba99130John Porto if (GlobalContext::Flags.getAlwaysExitSuccess()) 9944c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung return EC_None; 10044c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung return Val; 10144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung} 10244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 103db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf// Reports fatal error message, and then exits with success status 0. 10448e3ae5c62d7e626ed1a0dbbe38a7cc11a356260Jim Stichnothvoid reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason, 105db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf bool GenCrashDag) { 106db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf (void)UserData; 107db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf (void)GenCrashDag; 108db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 109db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // Note: This code is (mostly) copied from llvm/lib/Support/ErrorHandling.cpp 110db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 111db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // Blast the result out to stderr. We don't try hard to make sure this 112db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // succeeds (e.g. handling EINTR) and we can't use errs() here because 113db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // raw ostreams can call report_fatal_error. 114db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf llvm::SmallVector<char, 64> Buffer; 115db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf llvm::raw_svector_ostream OS(Buffer); 116db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf OS << "LLVM ERROR: " << Reason << "\n"; 117db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf llvm::StringRef MessageStr = OS.str(); 1184e6ea83aecbae8725af6f8498847ce4cbecbe33bKarl Schimpf ssize_t Written = 1194e6ea83aecbae8725af6f8498847ce4cbecbe33bKarl Schimpf std::fwrite(MessageStr.data(), sizeof(char), MessageStr.size(), stderr); 1204e6ea83aecbae8725af6f8498847ce4cbecbe33bKarl Schimpf (void)Written; // If something went wrong, we deliberately just give up. 121db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 122db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // If we reached here, we are failing ungracefully. Run the interrupt handlers 123db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // to make sure any special cleanups get done, in particular that we remove 124db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // files registered with RemoveFileOnSignal. 125db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf llvm::sys::RunInterruptHandlers(); 126db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 127db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf exit(0); 128db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf} 129db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 130686f35e569f7fac14d357550faed542de261415bJim Stichnothstruct { 131686f35e569f7fac14d357550faed542de261415bJim Stichnoth const char *FlagName; 132686f35e569f7fac14d357550faed542de261415bJim Stichnoth bool FlagValue; 133686f35e569f7fac14d357550faed542de261415bJim Stichnoth} ConditionalBuildAttributes[] = { 134686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"dump", BuildDefs::dump()}, 135686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"llvm_cl", BuildDefs::llvmCl()}, 136686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"llvm_ir", BuildDefs::llvmIr()}, 137686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"llvm_ir_as_input", BuildDefs::llvmIrAsInput()}, 138686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"minimal_build", BuildDefs::minimal()}, 139686f35e569f7fac14d357550faed542de261415bJim Stichnoth {"browser_mode", BuildDefs::browser()}}; 140686f35e569f7fac14d357550faed542de261415bJim Stichnoth 141686f35e569f7fac14d357550faed542de261415bJim Stichnoth/// Dumps values of build attributes to Stream if Stream is non-null. 142686f35e569f7fac14d357550faed542de261415bJim Stichnothvoid dumpBuildAttributes(Ostream &Str) { 143686f35e569f7fac14d357550faed542de261415bJim Stichnoth// List the supported targets. 144686f35e569f7fac14d357550faed542de261415bJim Stichnoth#define SUBZERO_TARGET(TARGET) Str << "target_" #TARGET << "\n"; 145999a22f0bbd828c9fc711b6100194f0678d1a08cJim Stichnoth#include "SZTargets.def" 146686f35e569f7fac14d357550faed542de261415bJim Stichnoth const char *Prefix[2] = {"no", "allow"}; 147686f35e569f7fac14d357550faed542de261415bJim Stichnoth for (size_t i = 0; i < llvm::array_lengthof(ConditionalBuildAttributes); 148686f35e569f7fac14d357550faed542de261415bJim Stichnoth ++i) { 149686f35e569f7fac14d357550faed542de261415bJim Stichnoth const auto &A = ConditionalBuildAttributes[i]; 150686f35e569f7fac14d357550faed542de261415bJim Stichnoth Str << Prefix[A.FlagValue] << "_" << A.FlagName << "\n"; 151686f35e569f7fac14d357550faed542de261415bJim Stichnoth } 152686f35e569f7fac14d357550faed542de261415bJim Stichnoth} 153686f35e569f7fac14d357550faed542de261415bJim Stichnoth 15444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung} // end of anonymous namespace 15544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 15644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voungvoid CLCompileServer::run() { 15720b71f5890ee8651983b126c5978594a01e0af96Jim Stichnoth if (BuildDefs::dump()) { 158b2d5084c573ef5de15eb0e87bdde5dfba59e524aJan Voung llvm::sys::PrintStackTraceOnErrorSignal(); 159b2d5084c573ef5de15eb0e87bdde5dfba59e524aJan Voung } 16044c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung ClFlags::parseFlags(argc, argv); 16198ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth ClFlags &Flags = GlobalContext::Flags; 16244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung ClFlags::getParsedClFlags(Flags); 16344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 164db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf // Override report_fatal_error if we want to exit with 0 status. 165c5bc5cb33580557062574416794244a09ba99130John Porto if (Flags.getAlwaysExitSuccess()) 166db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); 167db2fd9c0c3e5cad4c5a99497e226f3ec970cbcadKarl Schimpf 168620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth std::error_code EC; 169c5bc5cb33580557062574416794244a09ba99130John Porto std::unique_ptr<Ostream> Ls = makeStream(Flags.getLogFilename(), EC); 170620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth if (EC) { 171620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth llvm::report_fatal_error("Unable to open log file"); 172620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth } 17344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung Ls->SetUnbuffered(); 1744c16ac0f4f184128060f3b8c3db519f1a6293dfaDavid Sehr Ice::LinuxMallocProfiling _(Flags.getNumTranslationThreads(), Ls.get()); 1754c16ac0f4f184128060f3b8c3db519f1a6293dfaDavid Sehr 17644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung std::unique_ptr<Ostream> Os; 17744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung std::unique_ptr<ELFStreamer> ELFStr; 17844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung switch (Flags.getOutFileType()) { 17944c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung case FT_Elf: { 180c5bc5cb33580557062574416794244a09ba99130John Porto if (Flags.getOutputFilename() == "-" && !Flags.getGenerateBuildAtts()) { 18144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung *Ls << "Error: writing binary ELF to stdout is unsupported\n"; 18298ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth return transferErrorCode(getReturnValue(Ice::EC_Args)); 18344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 18444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung std::unique_ptr<llvm::raw_fd_ostream> FdOs(new llvm::raw_fd_ostream( 185c5bc5cb33580557062574416794244a09ba99130John Porto Flags.getOutputFilename(), EC, llvm::sys::fs::F_None)); 18644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung if (EC) { 187c5bc5cb33580557062574416794244a09ba99130John Porto *Ls << "Failed to open output file: " << Flags.getOutputFilename() 18844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung << ":\n" << EC.message() << "\n"; 18998ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth return transferErrorCode(getReturnValue(Ice::EC_Args)); 19044c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 19144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung ELFStr.reset(new ELFStreamer(*FdOs.get())); 19244c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung Os.reset(FdOs.release()); 19357e126899b20c65ff3ea23a3b7d7a67ab30b99dcAndrew Scull // NaCl sets st_blksize to 0, and LLVM uses that to pick the default 19457e126899b20c65ff3ea23a3b7d7a67ab30b99dcAndrew Scull // preferred buffer size. Set to something non-zero. 19544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung Os->SetBufferSize(1 << 14); 19644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } break; 19744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung case FT_Asm: 19844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung case FT_Iasm: { 199c5bc5cb33580557062574416794244a09ba99130John Porto Os = makeStream(Flags.getOutputFilename(), EC); 200620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth if (EC) { 201c5bc5cb33580557062574416794244a09ba99130John Porto *Ls << "Failed to open output file: " << Flags.getOutputFilename() 202620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth << ":\n" << EC.message() << "\n"; 20398ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth return transferErrorCode(getReturnValue(Ice::EC_Args)); 204620ad732db0def93eee3928f9ebebe88b279f63dJim Stichnoth } 20544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung Os->SetUnbuffered(); 20644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } break; 20744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 20844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 209c5bc5cb33580557062574416794244a09ba99130John Porto if (BuildDefs::minimal() && Flags.getBitcodeAsText()) 210cb6e95aac252a35c66705fb5e30d3c5e9ba4c1dcKarl Schimpf llvm::report_fatal_error("Can't specify 'bitcode-as-text' flag in " 211cb6e95aac252a35c66705fb5e30d3c5e9ba4c1dcKarl Schimpf "minimal build"); 212cb6e95aac252a35c66705fb5e30d3c5e9ba4c1dcKarl Schimpf 21344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung IceString StrError; 21444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung std::unique_ptr<llvm::DataStreamer> InputStream( 215c5bc5cb33580557062574416794244a09ba99130John Porto (!BuildDefs::minimal() && Flags.getBitcodeAsText()) 216c5bc5cb33580557062574416794244a09ba99130John Porto ? TextDataStreamer::create(Flags.getIRFilename(), &StrError) 217c5bc5cb33580557062574416794244a09ba99130John Porto : llvm::getDataFileStreamer(Flags.getIRFilename(), &StrError)); 21844c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung if (!StrError.empty() || !InputStream) { 219c5bc5cb33580557062574416794244a09ba99130John Porto llvm::SMDiagnostic Err(Flags.getIRFilename(), llvm::SourceMgr::DK_Error, 220c5bc5cb33580557062574416794244a09ba99130John Porto StrError); 221c5bc5cb33580557062574416794244a09ba99130John Porto Err.print(Flags.getAppName().c_str(), *Ls); 22298ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth return transferErrorCode(getReturnValue(Ice::EC_Bitcode)); 22344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 22444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 225c5bc5cb33580557062574416794244a09ba99130John Porto if (Flags.getGenerateBuildAtts()) { 226686f35e569f7fac14d357550faed542de261415bJim Stichnoth dumpBuildAttributes(*Os.get()); 22798ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth return transferErrorCode(getReturnValue(Ice::EC_None)); 228686f35e569f7fac14d357550faed542de261415bJim Stichnoth } 229686f35e569f7fac14d357550faed542de261415bJim Stichnoth 23098ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get())); 23144c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung if (Ctx->getFlags().getNumTranslationThreads() != 0) { 232c5bc5cb33580557062574416794244a09ba99130John Porto std::thread CompileThread([this, &Flags, &InputStream]() { 23344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung Ctx->initParserThread(); 234c5bc5cb33580557062574416794244a09ba99130John Porto getCompiler().run(Flags, *Ctx.get(), std::move(InputStream)); 23544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung }); 23644c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung CompileThread.join(); 23744c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } else { 238c5bc5cb33580557062574416794244a09ba99130John Porto getCompiler().run(Flags, *Ctx.get(), std::move(InputStream)); 23944c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung } 24098ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth transferErrorCode( 24198ba00666271be1bdcd45b72b3dec04419efe61bJim Stichnoth getReturnValue(static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); 2429f9aa2c1953db5253dab1216cf44a9cbcb7cb176Jim Stichnoth Ctx->dumpConstantLookupCounts(); 24344c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung} 24444c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung 24544c3a8046f4c81f9b4476f8c3c72723b584c312dJan Voung} // end of namespace Ice 246