Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(673)

Side by Side Diff: src/IceCompiler.cpp

Issue 1541063002: misc cleanup of Compiler::run (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: changes suggested by stichnot Created 4 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceCompiler.cpp - Driver for bitcode translation -------===// 1 //===- subzero/src/IceCompiler.cpp - Driver for bitcode translation -------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 18 matching lines...) Expand all
29 29
30 #pragma clang diagnostic push 30 #pragma clang diagnostic push
31 #pragma clang diagnostic ignored "-Wunused-parameter" 31 #pragma clang diagnostic ignored "-Wunused-parameter"
32 #include "llvm/ADT/STLExtras.h" 32 #include "llvm/ADT/STLExtras.h"
33 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" 33 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h"
34 #include "llvm/IR/LLVMContext.h" 34 #include "llvm/IR/LLVMContext.h"
35 #include "llvm/IR/Module.h" 35 #include "llvm/IR/Module.h"
36 #include "llvm/IRReader/IRReader.h" 36 #include "llvm/IRReader/IRReader.h"
37 #include "llvm/Support/SourceMgr.h" 37 #include "llvm/Support/SourceMgr.h"
38 #include "llvm/Support/StreamingMemoryObject.h" 38 #include "llvm/Support/StreamingMemoryObject.h"
39
40 #include <regex>
41
39 #pragma clang diagnostic pop 42 #pragma clang diagnostic pop
40 43
41 namespace Ice { 44 namespace Ice {
42 45
43 namespace { 46 namespace {
44 47
45 struct { 48 struct {
46 const char *FlagName; 49 const char *FlagName;
47 bool FlagValue; 50 bool FlagValue;
48 } ConditionalBuildAttributes[] = { 51 } ConditionalBuildAttributes[] = {
49 {"dump", BuildDefs::dump()}, 52 {"dump", BuildDefs::dump()},
50 {"llvm_cl", BuildDefs::llvmCl()}, 53 {"llvm_cl", BuildDefs::llvmCl()},
51 {"llvm_ir", BuildDefs::llvmIr()}, 54 {"llvm_ir", BuildDefs::llvmIr()},
52 {"llvm_ir_as_input", BuildDefs::llvmIrAsInput()}, 55 {"llvm_ir_as_input", BuildDefs::llvmIrAsInput()},
53 {"minimal_build", BuildDefs::minimal()}, 56 {"minimal_build", BuildDefs::minimal()},
54 {"browser_mode", BuildDefs::browser()}}; 57 {"browser_mode", BuildDefs::browser()}};
55 58
56 /// Dumps values of build attributes to Stream if Stream is non-null. 59 /// Dumps values of build attributes to Stream if Stream is non-null.
57 void dumpBuildAttributes(Ostream *Stream) { 60 void dumpBuildAttributes(Ostream &Str) {
58 if (Stream == nullptr)
59 return;
60 // List the supported targets. 61 // List the supported targets.
61 #define SUBZERO_TARGET(TARGET) *Stream << "target_" #TARGET << "\n"; 62 #define SUBZERO_TARGET(TARGET) Str << "target_" #TARGET << "\n";
62 #include "llvm/Config/SZTargets.def" 63 #include "llvm/Config/SZTargets.def"
63 const char *Prefix[2] = {"no", "allow"}; 64 const char *Prefix[2] = {"no", "allow"};
64 for (size_t i = 0; i < llvm::array_lengthof(ConditionalBuildAttributes); 65 for (size_t i = 0; i < llvm::array_lengthof(ConditionalBuildAttributes);
65 ++i) { 66 ++i) {
66 const auto &A = ConditionalBuildAttributes[i]; 67 const auto &A = ConditionalBuildAttributes[i];
67 *Stream << Prefix[A.FlagValue] << "_" << A.FlagName << "\n"; 68 Str << Prefix[A.FlagValue] << "_" << A.FlagName << "\n";
68 } 69 }
69 } 70 }
71 bool llvmIRInput(const IceString &Filename) {
72 return BuildDefs::llvmIrAsInput() &&
73 std::regex_match(Filename, std::regex(".*\\.ll"));
74 }
70 75
71 } // end of anonymous namespace 76 } // end of anonymous namespace
72 77
73 void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx, 78 void Compiler::run(const Ice::ClFlagsExtra &ExtraFlags, GlobalContext &Ctx,
74 std::unique_ptr<llvm::DataStreamer> &&InputStream) { 79 std::unique_ptr<llvm::DataStreamer> &&InputStream) {
75 dumpBuildAttributes(ExtraFlags.getGenerateBuildAtts() ? &Ctx.getStrDump() 80 if (ExtraFlags.getGenerateBuildAtts()) {
76 : nullptr); 81 dumpBuildAttributes(Ctx.getStrDump());
77 if (ExtraFlags.getGenerateBuildAtts()) 82 Ctx.getErrorStatus()->assign(EC_None);
78 return Ctx.getErrorStatus()->assign(EC_None); 83 return;
79 84 }
80 // The Minimal build (specifically, when dump()/emit() are not implemented) 85 // The Minimal build (specifically, when dump()/emit() are not implemented)
81 // allows only --filetype=obj. Check here to avoid cryptic error messages 86 // allows only --filetype=obj. Check here to avoid cryptic error messages
82 // downstream. 87 // downstream.
83 if (!BuildDefs::dump() && Ctx.getFlags().getOutFileType() != FT_Elf) { 88 if (!BuildDefs::dump() && Ctx.getFlags().getOutFileType() != FT_Elf) {
84 // TODO(stichnot): Access the actual command-line argument via 89 // TODO(stichnot): Access the actual command-line argument via
85 // llvm::Option.ArgStr and .ValueStr . 90 // llvm::Option.ArgStr and .ValueStr .
86 Ctx.getStrError() 91 Ctx.getStrError()
87 << "Error: only --filetype=obj is supported in this build.\n"; 92 << "Error: only --filetype=obj is supported in this build.\n";
88 return Ctx.getErrorStatus()->assign(EC_Args); 93 Ctx.getErrorStatus()->assign(EC_Args);
94 return;
89 } 95 }
90 96
91 // Force -build-on-read=0 for .ll files.
92 const std::string LLSuffix = ".ll";
93 const IceString &IRFilename = ExtraFlags.getIRFilename();
94 bool BuildOnRead = ExtraFlags.getBuildOnRead();
95 if (BuildDefs::llvmIrAsInput() && IRFilename.length() >= LLSuffix.length() &&
96 IRFilename.compare(IRFilename.length() - LLSuffix.length(),
97 LLSuffix.length(), LLSuffix) == 0)
98 BuildOnRead = false;
99
100 TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx); 97 TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx);
101 98
102 Ctx.emitFileHeader(); 99 Ctx.emitFileHeader();
103 Ctx.startWorkerThreads(); 100 Ctx.startWorkerThreads();
104 101
105 std::unique_ptr<Translator> Translator; 102 std::unique_ptr<Translator> Translator;
103 const IceString &IRFilename = ExtraFlags.getIRFilename();
104 bool BuildOnRead = ExtraFlags.getBuildOnRead() && !llvmIRInput(IRFilename);
106 if (BuildOnRead) { 105 if (BuildOnRead) {
107 std::unique_ptr<PNaClTranslator> PTranslator(new PNaClTranslator(&Ctx)); 106 std::unique_ptr<PNaClTranslator> PTranslator(new PNaClTranslator(&Ctx));
108 std::unique_ptr<llvm::StreamingMemoryObject> MemObj( 107 std::unique_ptr<llvm::StreamingMemoryObject> MemObj(
109 new llvm::StreamingMemoryObjectImpl(InputStream.release())); 108 new llvm::StreamingMemoryObjectImpl(InputStream.release()));
110 PTranslator->translate(IRFilename, std::move(MemObj)); 109 PTranslator->translate(IRFilename, std::move(MemObj));
111 Translator.reset(PTranslator.release()); 110 Translator.reset(PTranslator.release());
112 } else if (BuildDefs::llvmIr()) { 111 } else if (BuildDefs::llvmIr()) {
113 if (BuildDefs::browser()) { 112 if (BuildDefs::browser()) {
114 Ctx.getStrError() 113 Ctx.getStrError()
115 << "non BuildOnRead is not supported w/ PNACL_BROWSER_TRANSLATOR\n"; 114 << "non BuildOnRead is not supported w/ PNACL_BROWSER_TRANSLATOR\n";
116 return Ctx.getErrorStatus()->assign(EC_Args); 115 Ctx.getErrorStatus()->assign(EC_Args);
116 return;
117 } 117 }
118 // Parse the input LLVM IR file into a module. 118 // Parse the input LLVM IR file into a module.
119 llvm::SMDiagnostic Err; 119 llvm::SMDiagnostic Err;
120 TimerMarker T1(Ice::TimerStack::TT_parse, &Ctx); 120 TimerMarker T1(Ice::TimerStack::TT_parse, &Ctx);
121 llvm::DiagnosticHandlerFunction DiagnosticHandler = 121 llvm::DiagnosticHandlerFunction DiagnosticHandler =
122 ExtraFlags.getLLVMVerboseErrors() 122 ExtraFlags.getLLVMVerboseErrors()
123 ? redirectNaClDiagnosticToStream(llvm::errs()) 123 ? redirectNaClDiagnosticToStream(llvm::errs())
124 : nullptr; 124 : nullptr;
125 std::unique_ptr<llvm::Module> Mod = 125 std::unique_ptr<llvm::Module> Mod =
126 NaClParseIRFile(IRFilename, ExtraFlags.getInputFileFormat(), Err, 126 NaClParseIRFile(IRFilename, ExtraFlags.getInputFileFormat(), Err,
127 llvm::getGlobalContext(), DiagnosticHandler); 127 llvm::getGlobalContext(), DiagnosticHandler);
128 if (!Mod) { 128 if (!Mod) {
129 Err.print(ExtraFlags.getAppName().c_str(), llvm::errs()); 129 Err.print(ExtraFlags.getAppName().c_str(), llvm::errs());
130 return Ctx.getErrorStatus()->assign(EC_Bitcode); 130 Ctx.getErrorStatus()->assign(EC_Bitcode);
131 return;
131 } 132 }
132 133
133 std::unique_ptr<Converter> Converter(new class Converter(Mod.get(), &Ctx)); 134 std::unique_ptr<Converter> Converter(new class Converter(Mod.get(), &Ctx));
134 Converter->convertToIce(); 135 Converter->convertToIce();
135 Translator.reset(Converter.release()); 136 Translator.reset(Converter.release());
136 } else { 137 } else {
137 Ctx.getStrError() << "Error: Build doesn't allow LLVM IR, " 138 Ctx.getStrError() << "Error: Build doesn't allow LLVM IR, "
138 << "--build-on-read=0 not allowed\n"; 139 << "--build-on-read=0 not allowed\n";
139 return Ctx.getErrorStatus()->assign(EC_Args); 140 Ctx.getErrorStatus()->assign(EC_Args);
141 return;
140 } 142 }
141 143
142 Ctx.waitForWorkerThreads(); 144 Ctx.waitForWorkerThreads();
143 if (Translator->getErrorStatus()) { 145 if (Translator->getErrorStatus()) {
144 Ctx.getErrorStatus()->assign(Translator->getErrorStatus().value()); 146 Ctx.getErrorStatus()->assign(Translator->getErrorStatus().value());
145 } else { 147 } else {
146 Ctx.lowerGlobals("last"); 148 Ctx.lowerGlobals("last");
147 Ctx.lowerProfileData(); 149 Ctx.lowerProfileData();
148 Ctx.lowerConstants(); 150 Ctx.lowerConstants();
149 Ctx.lowerJumpTables(); 151 Ctx.lowerJumpTables();
(...skipping 10 matching lines...) Expand all
160 162
161 if (Ctx.getFlags().getTimeEachFunction()) { 163 if (Ctx.getFlags().getTimeEachFunction()) {
162 constexpr bool DumpCumulative = false; 164 constexpr bool DumpCumulative = false;
163 Ctx.dumpTimers(GlobalContext::TSK_Funcs, DumpCumulative); 165 Ctx.dumpTimers(GlobalContext::TSK_Funcs, DumpCumulative);
164 } 166 }
165 constexpr bool FinalStats = true; 167 constexpr bool FinalStats = true;
166 Ctx.dumpStats("_FINAL_", FinalStats); 168 Ctx.dumpStats("_FINAL_", FinalStats);
167 } 169 }
168 170
169 } // end of namespace Ice 171 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698