OLD | NEW |
1 //===- subzero/src/main.cpp - Driver for bitcode translation --------------===// | 1 //===- subzero/src/main.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 // This file defines a driver for translating PNaCl bitcode into native code. | 10 // This file defines a driver for translating PNaCl bitcode into native code. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 cl::values( | 62 cl::values( |
63 clEnumValN(Ice::Target_X8632, "x8632", "x86-32"), | 63 clEnumValN(Ice::Target_X8632, "x8632", "x86-32"), |
64 clEnumValN(Ice::Target_X8632, "x86-32", "x86-32 (same as x8632)"), | 64 clEnumValN(Ice::Target_X8632, "x86-32", "x86-32 (same as x8632)"), |
65 clEnumValN(Ice::Target_X8632, "x86_32", "x86-32 (same as x8632)"), | 65 clEnumValN(Ice::Target_X8632, "x86_32", "x86-32 (same as x8632)"), |
66 clEnumValN(Ice::Target_X8664, "x8664", "x86-64"), | 66 clEnumValN(Ice::Target_X8664, "x8664", "x86-64"), |
67 clEnumValN(Ice::Target_X8664, "x86-64", "x86-64 (same as x8664)"), | 67 clEnumValN(Ice::Target_X8664, "x86-64", "x86-64 (same as x8664)"), |
68 clEnumValN(Ice::Target_X8664, "x86_64", "x86-64 (same as x8664)"), | 68 clEnumValN(Ice::Target_X8664, "x86_64", "x86-64 (same as x8664)"), |
69 clEnumValN(Ice::Target_ARM32, "arm", "arm32"), | 69 clEnumValN(Ice::Target_ARM32, "arm", "arm32"), |
70 clEnumValN(Ice::Target_ARM32, "arm32", "arm32 (same as arm)"), | 70 clEnumValN(Ice::Target_ARM32, "arm32", "arm32 (same as arm)"), |
71 clEnumValN(Ice::Target_ARM64, "arm64", "arm64"), clEnumValEnd)); | 71 clEnumValN(Ice::Target_ARM64, "arm64", "arm64"), clEnumValEnd)); |
| 72 |
| 73 cl::opt<Ice::TargetInstructionSet> InstructionSet( |
| 74 "mattr", cl::desc("Target architecture attributes"), |
| 75 cl::init(Ice::X86InstructionSet_SSE2), |
| 76 cl::values(clEnumValN(Ice::X86InstructionSet_SSE2, "sse2", |
| 77 "Enable SSE2 instructions (default)"), |
| 78 clEnumValN(Ice::X86InstructionSet_SSE4_1, "sse4.1", |
| 79 "Enable SSE 4.1 instructions"), |
| 80 clEnumValEnd)); |
| 81 |
72 static cl::opt<bool> UseSandboxing("sandbox", cl::desc("Use sandboxing")); | 82 static cl::opt<bool> UseSandboxing("sandbox", cl::desc("Use sandboxing")); |
73 static cl::opt<bool> | 83 static cl::opt<bool> |
74 FunctionSections("ffunction-sections", | 84 FunctionSections("ffunction-sections", |
75 cl::desc("Emit functions into separate sections")); | 85 cl::desc("Emit functions into separate sections")); |
76 static cl::opt<bool> | 86 static cl::opt<bool> |
77 DataSections("fdata-sections", | 87 DataSections("fdata-sections", |
78 cl::desc("Emit (global) data into separate sections")); | 88 cl::desc("Emit (global) data into separate sections")); |
79 static cl::opt<Ice::OptLevel> | 89 static cl::opt<Ice::OptLevel> |
80 OptLevel(cl::desc("Optimization level"), cl::init(Ice::Opt_m1), | 90 OptLevel(cl::desc("Optimization level"), cl::init(Ice::Opt_m1), |
81 cl::value_desc("level"), | 91 cl::value_desc("level"), |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 // sequential, i.e. parser, translator, and emitter all within the | 214 // sequential, i.e. parser, translator, and emitter all within the |
205 // same single thread. (This may need a slight rework if we expand to | 215 // same single thread. (This may need a slight rework if we expand to |
206 // multiple parser or emitter threads.) | 216 // multiple parser or emitter threads.) |
207 static cl::opt<uint32_t> NumThreads( | 217 static cl::opt<uint32_t> NumThreads( |
208 "threads", | 218 "threads", |
209 cl::desc("Number of translation threads (0 for purely sequential)"), | 219 cl::desc("Number of translation threads (0 for purely sequential)"), |
210 // TODO(stichnot): Settle on a good default. Consider | 220 // TODO(stichnot): Settle on a good default. Consider |
211 // something related to std::thread::hardware_concurrency(). | 221 // something related to std::thread::hardware_concurrency(). |
212 cl::init(2)); | 222 cl::init(2)); |
213 | 223 |
| 224 static cl::opt<bool> DoNopInsertion("nop-insertion", |
| 225 cl::desc("Randomly insert NOPs"), |
| 226 cl::init(false)); |
| 227 |
| 228 static cl::opt<int> MaxNopsPerInstruction( |
| 229 "max-nops-per-instruction", |
| 230 cl::desc("Max number of nops to insert per instruction"), cl::init(1)); |
| 231 |
| 232 static cl::opt<int> NopProbabilityAsPercentage( |
| 233 "nop-insertion-percentage", |
| 234 cl::desc("Nop insertion probability as percentage"), cl::init(10)); |
| 235 |
| 236 static cl::opt<bool> |
| 237 RandomizeRegisterAllocation("randomize-regalloc", |
| 238 cl::desc("Randomize register allocation"), |
| 239 cl::init(false)); |
| 240 |
| 241 // TODO(stichnot): See if we can easily use LLVM's -rng-seed option |
| 242 // and implementation. I expect the implementation is different and |
| 243 // therefore the tests would need to be changed. |
| 244 cl::opt<unsigned long long> |
| 245 RandomSeed("sz-seed", cl::desc("Seed the random number generator"), |
| 246 cl::init(time(0))); |
| 247 |
214 static int GetReturnValue(int Val) { | 248 static int GetReturnValue(int Val) { |
215 if (AlwaysExitSuccess) | 249 if (AlwaysExitSuccess) |
216 return 0; | 250 return 0; |
217 return Val; | 251 return Val; |
218 } | 252 } |
219 | 253 |
220 static struct { | 254 static struct { |
221 const char *FlagName; | 255 const char *FlagName; |
222 int FlagValue; | 256 int FlagValue; |
223 } ConditionalBuildAttributes[] = {{"dump", ALLOW_DUMP}, | 257 } ConditionalBuildAttributes[] = {{"dump", ALLOW_DUMP}, |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 Flags.setDataSections(DataSections); | 331 Flags.setDataSections(DataSections); |
298 Flags.setDecorateAsm(DecorateAsm); | 332 Flags.setDecorateAsm(DecorateAsm); |
299 Flags.setDefaultFunctionPrefix(DefaultFunctionPrefix); | 333 Flags.setDefaultFunctionPrefix(DefaultFunctionPrefix); |
300 Flags.setDefaultGlobalPrefix(DefaultGlobalPrefix); | 334 Flags.setDefaultGlobalPrefix(DefaultGlobalPrefix); |
301 Flags.setDisableInternal(DisableInternal); | 335 Flags.setDisableInternal(DisableInternal); |
302 Flags.setDisableIRGeneration(DisableIRGeneration); | 336 Flags.setDisableIRGeneration(DisableIRGeneration); |
303 Flags.setDisableTranslation(DisableTranslation); | 337 Flags.setDisableTranslation(DisableTranslation); |
304 Flags.setDumpStats(DumpStats); | 338 Flags.setDumpStats(DumpStats); |
305 Flags.setFunctionSections(FunctionSections); | 339 Flags.setFunctionSections(FunctionSections); |
306 Flags.setNumTranslationThreads(NumThreads); | 340 Flags.setNumTranslationThreads(NumThreads); |
| 341 Flags.setOptLevel(OptLevel); |
307 Flags.setPhiEdgeSplit(EnablePhiEdgeSplit); | 342 Flags.setPhiEdgeSplit(EnablePhiEdgeSplit); |
| 343 Flags.setRandomSeed(RandomSeed); |
| 344 Flags.setShouldDoNopInsertion(DoNopInsertion); |
| 345 Flags.setShouldRandomizeRegAlloc(RandomizeRegisterAllocation); |
308 Flags.setSubzeroTimingEnabled(SubzeroTimingEnabled); | 346 Flags.setSubzeroTimingEnabled(SubzeroTimingEnabled); |
| 347 Flags.setTargetArch(TargetArch); |
| 348 Flags.setTargetInstructionSet(InstructionSet); |
| 349 Flags.setTestPrefix(TestPrefix); |
309 Flags.setTimeEachFunction(TimeEachFunction); | 350 Flags.setTimeEachFunction(TimeEachFunction); |
310 Flags.setTimingFocusOn(TimingFocusOn); | 351 Flags.setTimingFocusOn(TimingFocusOn); |
311 Flags.setTranslateOnly(TranslateOnly); | 352 Flags.setTranslateOnly(TranslateOnly); |
312 Flags.setUseSandboxing(UseSandboxing); | 353 Flags.setUseSandboxing(UseSandboxing); |
313 Flags.setVerboseFocusOn(VerboseFocusOn); | 354 Flags.setVerboseFocusOn(VerboseFocusOn); |
314 Flags.setOutFileType(OutFileType); | 355 Flags.setOutFileType(OutFileType); |
| 356 Flags.setMaxNopsPerInstruction(MaxNopsPerInstruction); |
| 357 Flags.setNopProbabilityAsPercentage(NopProbabilityAsPercentage); |
| 358 Flags.setVerbose(VMask); |
315 | 359 |
316 // Force -build-on-read=0 for .ll files. | 360 // Force -build-on-read=0 for .ll files. |
317 const std::string LLSuffix = ".ll"; | 361 const std::string LLSuffix = ".ll"; |
318 if (IRFilename.length() >= LLSuffix.length() && | 362 if (IRFilename.length() >= LLSuffix.length() && |
319 IRFilename.compare(IRFilename.length() - LLSuffix.length(), | 363 IRFilename.compare(IRFilename.length() - LLSuffix.length(), |
320 LLSuffix.length(), LLSuffix) == 0) | 364 LLSuffix.length(), LLSuffix) == 0) |
321 BuildOnRead = false; | 365 BuildOnRead = false; |
322 | 366 |
323 // With the ELF writer, use a raw_fd_ostream to allow seeking. | 367 // With the ELF writer, use a raw_fd_ostream to allow seeking. |
324 // Also don't buffer, otherwise it gets pretty slow. | 368 // Also don't buffer, otherwise it gets pretty slow. |
(...skipping 25 matching lines...) Expand all Loading... |
350 if (OutputFilename != "-") { | 394 if (OutputFilename != "-") { |
351 Ofs.open(OutputFilename.c_str(), std::ofstream::out); | 395 Ofs.open(OutputFilename.c_str(), std::ofstream::out); |
352 Os.reset(new raw_os_ostream(Ofs)); | 396 Os.reset(new raw_os_ostream(Ofs)); |
353 } else { | 397 } else { |
354 Os.reset(new raw_os_ostream(std::cout)); | 398 Os.reset(new raw_os_ostream(std::cout)); |
355 } | 399 } |
356 Os->SetUnbuffered(); | 400 Os->SetUnbuffered(); |
357 } break; | 401 } break; |
358 } | 402 } |
359 | 403 |
360 Ice::GlobalContext Ctx(Ls.get(), Os.get(), ELFStr.get(), VMask, TargetArch, | 404 Ice::GlobalContext Ctx(Ls.get(), Os.get(), ELFStr.get(), Flags); |
361 OptLevel, TestPrefix, Flags); | |
362 | 405 |
363 Ice::TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx); | 406 Ice::TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx); |
364 | 407 |
365 if (OutFileType == Ice::FT_Elf) { | 408 if (OutFileType == Ice::FT_Elf) { |
366 Ice::TimerMarker T1(Ice::TimerStack::TT_emit, &Ctx); | 409 Ice::TimerMarker T1(Ice::TimerStack::TT_emit, &Ctx); |
367 Ctx.getObjectWriter()->writeInitialELFHeader(); | 410 Ctx.getObjectWriter()->writeInitialELFHeader(); |
368 } | 411 } |
369 | 412 |
370 Ctx.startWorkerThreads(); | 413 Ctx.startWorkerThreads(); |
371 | 414 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 if (SubzeroTimingEnabled) | 462 if (SubzeroTimingEnabled) |
420 Ctx.dumpTimers(); | 463 Ctx.dumpTimers(); |
421 if (TimeEachFunction) { | 464 if (TimeEachFunction) { |
422 const bool DumpCumulative = false; | 465 const bool DumpCumulative = false; |
423 Ctx.dumpTimers(Ice::GlobalContext::TSK_Funcs, DumpCumulative); | 466 Ctx.dumpTimers(Ice::GlobalContext::TSK_Funcs, DumpCumulative); |
424 } | 467 } |
425 const bool FinalStats = true; | 468 const bool FinalStats = true; |
426 Ctx.dumpStats("_FINAL_", FinalStats); | 469 Ctx.dumpStats("_FINAL_", FinalStats); |
427 return GetReturnValue(Ctx.getErrorStatus()->value()); | 470 return GetReturnValue(Ctx.getErrorStatus()->value()); |
428 } | 471 } |
OLD | NEW |