| Index: src/IceCompiler.cpp
|
| diff --git a/src/IceCompiler.cpp b/src/IceCompiler.cpp
|
| index c510e284a3c20ec2705ee8b47f7cb3828bf9059a..447251d205fcf4fc3bf78097518e5c7c8aad0dc0 100644
|
| --- a/src/IceCompiler.cpp
|
| +++ b/src/IceCompiler.cpp
|
| @@ -36,6 +36,9 @@
|
| #include "llvm/IRReader/IRReader.h"
|
| #include "llvm/Support/SourceMgr.h"
|
| #include "llvm/Support/StreamingMemoryObject.h"
|
| +
|
| +#include <regex>
|
| +
|
| #pragma clang diagnostic pop
|
|
|
| namespace Ice {
|
| @@ -54,29 +57,31 @@ struct {
|
| {"browser_mode", BuildDefs::browser()}};
|
|
|
| /// Dumps values of build attributes to Stream if Stream is non-null.
|
| -void dumpBuildAttributes(Ostream *Stream) {
|
| - if (Stream == nullptr)
|
| - return;
|
| +void dumpBuildAttributes(Ostream &Str) {
|
| // List the supported targets.
|
| -#define SUBZERO_TARGET(TARGET) *Stream << "target_" #TARGET << "\n";
|
| +#define SUBZERO_TARGET(TARGET) Str << "target_" #TARGET << "\n";
|
| #include "llvm/Config/SZTargets.def"
|
| const char *Prefix[2] = {"no", "allow"};
|
| for (size_t i = 0; i < llvm::array_lengthof(ConditionalBuildAttributes);
|
| ++i) {
|
| const auto &A = ConditionalBuildAttributes[i];
|
| - *Stream << Prefix[A.FlagValue] << "_" << A.FlagName << "\n";
|
| + Str << 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 +90,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 +112,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 +127,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 +137,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();
|
|
|