| Index: src/IceCompiler.cpp
|
| diff --git a/src/IceCompiler.cpp b/src/IceCompiler.cpp
|
| index c510e284a3c20ec2705ee8b47f7cb3828bf9059a..8736a665db173e211cc65fb173ab2e10fd5cbbdf 100644
|
| --- a/src/IceCompiler.cpp
|
| +++ b/src/IceCompiler.cpp
|
| @@ -17,6 +17,8 @@
|
| ///
|
| //===----------------------------------------------------------------------===//
|
|
|
| +#include <regex>
|
| +
|
| #include "IceCompiler.h"
|
|
|
| #include "IceBuildDefs.h"
|
| @@ -67,16 +69,20 @@ void dumpBuildAttributes(Ostream *Stream) {
|
| *Stream << Prefix[A.FlagValue] << "_" << A.FlagName << "\n";
|
| }
|
| }
|
| +bool llvmIRInput(const IceString &Filename) {
|
| + return BuildDefs::llvmIrAsInput() &&
|
| + std::regex_match(Filename, std::regex(".*\\.ll"));
|
| +}
|
|
|
| } // end of anonymous namespace
|
|
|
| void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
|
| std::unique_ptr<llvm::DataStreamer> &&InputStream) {
|
| - dumpBuildAttributes(ExtraFlags.getGenerateBuildAtts() ? &Ctx.getStrDump()
|
| - : nullptr);
|
| - if (ExtraFlags.getGenerateBuildAtts())
|
| - return Ctx.getErrorStatus()->assign(EC_None);
|
| -
|
| + if (ExtraFlags.getGenerateBuildAtts()) {
|
| + dumpBuildAttributes(&Ctx.getStrDump());
|
| + Ctx.getErrorStatus()->assign(EC_None);
|
| + return;
|
| + }
|
| // The Minimal build (specifically, when dump()/emit() are not implemented)
|
| // allows only --filetype=obj. Check here to avoid cryptic error messages
|
| // downstream.
|
| @@ -85,24 +91,18 @@ void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
|
| // llvm::Option.ArgStr and .ValueStr .
|
| Ctx.getStrError()
|
| << "Error: only --filetype=obj is supported in this build.\n";
|
| - return Ctx.getErrorStatus()->assign(EC_Args);
|
| + Ctx.getErrorStatus()->assign(EC_Args);
|
| + return;
|
| }
|
|
|
| - // Force -build-on-read=0 for .ll files.
|
| - const std::string LLSuffix = ".ll";
|
| - const IceString &IRFilename = ExtraFlags.getIRFilename();
|
| - bool BuildOnRead = ExtraFlags.getBuildOnRead();
|
| - if (BuildDefs::llvmIrAsInput() && IRFilename.length() >= LLSuffix.length() &&
|
| - IRFilename.compare(IRFilename.length() - LLSuffix.length(),
|
| - LLSuffix.length(), LLSuffix) == 0)
|
| - BuildOnRead = false;
|
| -
|
| TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx);
|
|
|
| Ctx.emitFileHeader();
|
| Ctx.startWorkerThreads();
|
|
|
| std::unique_ptr<Translator> Translator;
|
| + const IceString &IRFilename = ExtraFlags.getIRFilename();
|
| + bool BuildOnRead = ExtraFlags.getBuildOnRead() && !llvmIRInput(IRFilename);
|
| if (BuildOnRead) {
|
| std::unique_ptr<PNaClTranslator> PTranslator(new PNaClTranslator(&Ctx));
|
| std::unique_ptr<llvm::StreamingMemoryObject> MemObj(
|
| @@ -113,7 +113,8 @@ void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
|
| if (BuildDefs::browser()) {
|
| Ctx.getStrError()
|
| << "non BuildOnRead is not supported w/ PNACL_BROWSER_TRANSLATOR\n";
|
| - return Ctx.getErrorStatus()->assign(EC_Args);
|
| + Ctx.getErrorStatus()->assign(EC_Args);
|
| + return;
|
| }
|
| // Parse the input LLVM IR file into a module.
|
| llvm::SMDiagnostic Err;
|
| @@ -127,7 +128,8 @@ void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
|
| llvm::getGlobalContext(), DiagnosticHandler);
|
| if (!Mod) {
|
| Err.print(ExtraFlags.getAppName().c_str(), llvm::errs());
|
| - return Ctx.getErrorStatus()->assign(EC_Bitcode);
|
| + Ctx.getErrorStatus()->assign(EC_Bitcode);
|
| + return;
|
| }
|
|
|
| std::unique_ptr<Converter> Converter(new class Converter(Mod.get(), &Ctx));
|
| @@ -136,7 +138,8 @@ void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
|
| } else {
|
| Ctx.getStrError() << "Error: Build doesn't allow LLVM IR, "
|
| << "--build-on-read=0 not allowed\n";
|
| - return Ctx.getErrorStatus()->assign(EC_Args);
|
| + Ctx.getErrorStatus()->assign(EC_Args);
|
| + return;
|
| }
|
|
|
| Ctx.waitForWorkerThreads();
|
|
|