OLD | NEW |
1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===// | 1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===// |
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 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 << " MB\n"; | 286 << " MB\n"; |
287 Str << "|" << Name << "|Liveness Memory |" << Func->getLivenessMemoryMB() | 287 Str << "|" << Name << "|Liveness Memory |" << Func->getLivenessMemoryMB() |
288 << " MB\n"; | 288 << " MB\n"; |
289 } | 289 } |
290 } | 290 } |
291 | 291 |
292 GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, | 292 GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, |
293 ELFStreamer *ELFStr) | 293 ELFStreamer *ELFStr) |
294 : Strings(new StringPool()), ConstPool(new ConstantPool()), ErrorStatus(), | 294 : Strings(new StringPool()), ConstPool(new ConstantPool()), ErrorStatus(), |
295 StrDump(OsDump), StrEmit(OsEmit), StrError(OsError), IntrinsicsInfo(this), | 295 StrDump(OsDump), StrEmit(OsEmit), StrError(OsError), IntrinsicsInfo(this), |
296 ObjectWriter(), | 296 ObjectWriter(), OptQ(/*Sequential=*/getFlags().isSequential(), |
297 OptQ(/*Sequential=*/Flags.isSequential(), | 297 /*MaxSize=*/ |
298 /*MaxSize=*/ | 298 getFlags().isParseParallel() |
299 Flags.isParseParallel() ? MaxOptQSize | 299 ? MaxOptQSize |
300 : Flags.getNumTranslationThreads()), | 300 : getFlags().getNumTranslationThreads()), |
301 // EmitQ is allowed unlimited size. | 301 // EmitQ is allowed unlimited size. |
302 EmitQ(/*Sequential=*/Flags.isSequential()), | 302 EmitQ(/*Sequential=*/getFlags().isSequential()), |
303 DataLowering(TargetDataLowering::createLowering(this)) { | 303 DataLowering(TargetDataLowering::createLowering(this)) { |
304 assert(OsDump && "OsDump is not defined for GlobalContext"); | 304 assert(OsDump && "OsDump is not defined for GlobalContext"); |
305 assert(OsEmit && "OsEmit is not defined for GlobalContext"); | 305 assert(OsEmit && "OsEmit is not defined for GlobalContext"); |
306 assert(OsError && "OsError is not defined for GlobalContext"); | 306 assert(OsError && "OsError is not defined for GlobalContext"); |
307 // Make sure thread_local fields are properly initialized before any | 307 // Make sure thread_local fields are properly initialized before any |
308 // accesses are made. Do this here instead of at the start of | 308 // accesses are made. Do this here instead of at the start of |
309 // main() so that all clients (e.g. unit tests) can benefit for | 309 // main() so that all clients (e.g. unit tests) can benefit for |
310 // free. | 310 // free. |
311 GlobalContext::TlsInit(); | 311 GlobalContext::TlsInit(); |
312 Cfg::TlsInit(); | 312 Cfg::TlsInit(); |
313 Liveness::TlsInit(); | 313 Liveness::TlsInit(); |
314 // Create a new ThreadContext for the current thread. No need to | 314 // Create a new ThreadContext for the current thread. No need to |
315 // lock AllThreadContexts at this point since no other threads have | 315 // lock AllThreadContexts at this point since no other threads have |
316 // access yet to this GlobalContext object. | 316 // access yet to this GlobalContext object. |
317 ThreadContext *MyTLS = new ThreadContext(); | 317 ThreadContext *MyTLS = new ThreadContext(); |
318 AllThreadContexts.push_back(MyTLS); | 318 AllThreadContexts.push_back(MyTLS); |
319 ICE_TLS_SET_FIELD(TLS, MyTLS); | 319 ICE_TLS_SET_FIELD(TLS, MyTLS); |
320 // Pre-register built-in stack names. | 320 // Pre-register built-in stack names. |
321 if (BuildDefs::timers()) { | 321 if (BuildDefs::timers()) { |
322 // TODO(stichnot): There needs to be a strong relationship between | 322 // TODO(stichnot): There needs to be a strong relationship between |
323 // the newTimerStackID() return values and TSK_Default/TSK_Funcs. | 323 // the newTimerStackID() return values and TSK_Default/TSK_Funcs. |
324 newTimerStackID("Total across all functions"); | 324 newTimerStackID("Total across all functions"); |
325 newTimerStackID("Per-function summary"); | 325 newTimerStackID("Per-function summary"); |
326 } | 326 } |
327 Timers.initInto(MyTLS->Timers); | 327 Timers.initInto(MyTLS->Timers); |
328 switch (Flags.getOutFileType()) { | 328 switch (getFlags().getOutFileType()) { |
329 case FT_Elf: | 329 case FT_Elf: |
330 ObjectWriter.reset(new ELFObjectWriter(*this, *ELFStr)); | 330 ObjectWriter.reset(new ELFObjectWriter(*this, *ELFStr)); |
331 break; | 331 break; |
332 case FT_Asm: | 332 case FT_Asm: |
333 case FT_Iasm: | 333 case FT_Iasm: |
334 break; | 334 break; |
335 } | 335 } |
336 // Cache up front common constants. | 336 // Cache up front common constants. |
337 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ | 337 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ |
338 ConstZeroForType[IceType_##tag] = getConstantZeroInternal(IceType_##tag); | 338 ConstZeroForType[IceType_##tag] = getConstantZeroInternal(IceType_##tag); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 void GlobalContext::saveBlockInfoPtrs() { | 448 void GlobalContext::saveBlockInfoPtrs() { |
449 for (VariableDeclaration *Global : Globals) { | 449 for (VariableDeclaration *Global : Globals) { |
450 if (Cfg::isProfileGlobal(*Global)) { | 450 if (Cfg::isProfileGlobal(*Global)) { |
451 ProfileBlockInfos.push_back(Global); | 451 ProfileBlockInfos.push_back(Global); |
452 } | 452 } |
453 } | 453 } |
454 } | 454 } |
455 | 455 |
456 void GlobalContext::lowerGlobals(const std::string &SectionSuffix) { | 456 void GlobalContext::lowerGlobals(const std::string &SectionSuffix) { |
457 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this); | 457 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this); |
458 const bool DumpGlobalVariables = BuildDefs::dump() && | 458 const bool DumpGlobalVariables = |
459 (Flags.getVerbose() & IceV_GlobalInit) && | 459 BuildDefs::dump() && (getFlags().getVerbose() & IceV_GlobalInit) && |
460 Flags.getVerboseFocusOn().empty(); | 460 getFlags().getVerboseFocusOn().empty(); |
461 if (DumpGlobalVariables) { | 461 if (DumpGlobalVariables) { |
462 OstreamLocker L(this); | 462 OstreamLocker L(this); |
463 Ostream &Stream = getStrDump(); | 463 Ostream &Stream = getStrDump(); |
464 for (const Ice::VariableDeclaration *Global : Globals) { | 464 for (const Ice::VariableDeclaration *Global : Globals) { |
465 Global->dump(Stream); | 465 Global->dump(Stream); |
466 } | 466 } |
467 } | 467 } |
468 if (Flags.getDisableTranslation()) | 468 if (getFlags().getDisableTranslation()) |
469 return; | 469 return; |
470 | 470 |
471 saveBlockInfoPtrs(); | 471 saveBlockInfoPtrs(); |
472 // If we need to shuffle the layout of global variables, shuffle them now. | 472 // If we need to shuffle the layout of global variables, shuffle them now. |
473 if (getFlags().getReorderGlobalVariables()) { | 473 if (getFlags().getReorderGlobalVariables()) { |
474 // Create a random number generator for global variable reordering. | 474 // Create a random number generator for global variable reordering. |
475 RandomNumberGenerator RNG(getFlags().getRandomSeed(), | 475 RandomNumberGenerator RNG(getFlags().getRandomSeed(), |
476 RPE_GlobalVariableReordering); | 476 RPE_GlobalVariableReordering); |
477 RandomShuffle(Globals.begin(), Globals.end(), | 477 RandomShuffle(Globals.begin(), Globals.end(), |
478 [&RNG](int N) { return (uint32_t)RNG.next(N); }); | 478 [&RNG](int N) { return (uint32_t)RNG.next(N); }); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 return; | 672 return; |
673 OstreamLocker _(this); | 673 OstreamLocker _(this); |
674 Ostream &Str = getStrDump(); | 674 Ostream &Str = getStrDump(); |
675 Str << "GlobalContext strings:\n"; | 675 Str << "GlobalContext strings:\n"; |
676 getStrings()->dump(Str); | 676 getStrings()->dump(Str); |
677 } | 677 } |
678 | 678 |
679 void GlobalContext::dumpConstantLookupCounts() { | 679 void GlobalContext::dumpConstantLookupCounts() { |
680 if (!BuildDefs::dump()) | 680 if (!BuildDefs::dump()) |
681 return; | 681 return; |
682 const bool DumpCounts = (Flags.getVerbose() & IceV_ConstPoolStats) && | 682 const bool DumpCounts = (getFlags().getVerbose() & IceV_ConstPoolStats) && |
683 Flags.getVerboseFocusOn().empty(); | 683 getFlags().getVerboseFocusOn().empty(); |
684 if (!DumpCounts) | 684 if (!DumpCounts) |
685 return; | 685 return; |
686 | 686 |
687 OstreamLocker _(this); | 687 OstreamLocker _(this); |
688 Ostream &Str = getStrDump(); | 688 Ostream &Str = getStrDump(); |
689 Str << "Constant pool use stats: count+value+type\n"; | 689 Str << "Constant pool use stats: count+value+type\n"; |
690 #define X(WhichPool) \ | 690 #define X(WhichPool) \ |
691 for (auto *C : getConstPool()->WhichPool.getConstantPool()) { \ | 691 for (auto *C : getConstPool()->WhichPool.getConstantPool()) { \ |
692 Str << C->getLookupCount() << " "; \ | 692 Str << C->getLookupCount() << " "; \ |
693 C->dump(Str); \ | 693 C->dump(Str); \ |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 assert(Timers->size() > StackID); | 973 assert(Timers->size() > StackID); |
974 OstreamLocker L(this); | 974 OstreamLocker L(this); |
975 Timers->at(StackID).dump(getStrDump(), DumpCumulative); | 975 Timers->at(StackID).dump(getStrDump(), DumpCumulative); |
976 } | 976 } |
977 | 977 |
978 LockedPtr<StringPool> | 978 LockedPtr<StringPool> |
979 GlobalStringPoolTraits::getStrings(const GlobalContext *PoolOwner) { | 979 GlobalStringPoolTraits::getStrings(const GlobalContext *PoolOwner) { |
980 return PoolOwner->getStrings(); | 980 return PoolOwner->getStrings(); |
981 } | 981 } |
982 | 982 |
983 ClFlags GlobalContext::Flags; | |
984 | |
985 TimerIdT TimerMarker::getTimerIdFromFuncName(GlobalContext *Ctx, | 983 TimerIdT TimerMarker::getTimerIdFromFuncName(GlobalContext *Ctx, |
986 const std::string &FuncName) { | 984 const std::string &FuncName) { |
987 if (!BuildDefs::timers()) | 985 if (!BuildDefs::timers()) |
988 return 0; | 986 return 0; |
989 if (!Ctx->getFlags().getTimeEachFunction()) | 987 if (!getFlags().getTimeEachFunction()) |
990 return 0; | 988 return 0; |
991 return Ctx->getTimerID(GlobalContext::TSK_Funcs, FuncName); | 989 return Ctx->getTimerID(GlobalContext::TSK_Funcs, FuncName); |
992 } | 990 } |
993 | 991 |
994 void TimerMarker::push() { | 992 void TimerMarker::push() { |
995 switch (StackID) { | 993 switch (StackID) { |
996 case GlobalContext::TSK_Default: | 994 case GlobalContext::TSK_Default: |
997 Active = Ctx->getFlags().getSubzeroTimingEnabled(); | 995 Active = getFlags().getSubzeroTimingEnabled(); |
998 break; | 996 break; |
999 case GlobalContext::TSK_Funcs: | 997 case GlobalContext::TSK_Funcs: |
1000 Active = Ctx->getFlags().getTimeEachFunction(); | 998 Active = getFlags().getTimeEachFunction(); |
1001 break; | 999 break; |
1002 default: | 1000 default: |
1003 break; | 1001 break; |
1004 } | 1002 } |
1005 if (Active) | 1003 if (Active) |
1006 Ctx->pushTimer(ID, StackID); | 1004 Ctx->pushTimer(ID, StackID); |
1007 } | 1005 } |
1008 | 1006 |
1009 void TimerMarker::pushCfg(const Cfg *Func) { | 1007 void TimerMarker::pushCfg(const Cfg *Func) { |
1010 Ctx = Func->getContext(); | 1008 Ctx = Func->getContext(); |
1011 Active = | 1009 Active = Func->getFocusedTiming() || getFlags().getSubzeroTimingEnabled(); |
1012 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); | |
1013 if (Active) | 1010 if (Active) |
1014 Ctx->pushTimer(ID, StackID); | 1011 Ctx->pushTimer(ID, StackID); |
1015 } | 1012 } |
1016 | 1013 |
1017 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); | 1014 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); |
1018 | 1015 |
1019 } // end of namespace Ice | 1016 } // end of namespace Ice |
OLD | NEW |