| 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 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 Timers.initInto(MyTLS->Timers); | 285 Timers.initInto(MyTLS->Timers); |
| 286 switch (Flags.getOutFileType()) { | 286 switch (Flags.getOutFileType()) { |
| 287 case FT_Elf: | 287 case FT_Elf: |
| 288 ObjectWriter.reset(new ELFObjectWriter(*this, *ELFStr)); | 288 ObjectWriter.reset(new ELFObjectWriter(*this, *ELFStr)); |
| 289 break; | 289 break; |
| 290 case FT_Asm: | 290 case FT_Asm: |
| 291 case FT_Iasm: | 291 case FT_Iasm: |
| 292 break; | 292 break; |
| 293 } | 293 } |
| 294 | 294 |
| 295 // ProfileBlockInfoVarDecl is initialized here because it takes this as a | |
| 296 // parameter -- we want to | |
| 297 // ensure that at least this' member variables are initialized. | |
| 298 ProfileBlockInfoVarDecl = VariableDeclaration::createExternal(this); | |
| 299 ProfileBlockInfoVarDecl->setAlignment(typeWidthInBytes(IceType_i64)); | |
| 300 ProfileBlockInfoVarDecl->setIsConstant(true); | |
| 301 | |
| 302 // Note: if you change this symbol, make sure to update | |
| 303 // runtime/szrt_profiler.c as well. | |
| 304 ProfileBlockInfoVarDecl->setName("__Sz_block_profile_info"); | |
| 305 | |
| 306 TargetLowering::staticInit(this); | 295 TargetLowering::staticInit(this); |
| 307 } | 296 } |
| 308 | 297 |
| 309 void GlobalContext::translateFunctions() { | 298 void GlobalContext::translateFunctions() { |
| 310 TimerMarker Timer(TimerStack::TT_translateFunctions, this); | 299 TimerMarker Timer(TimerStack::TT_translateFunctions, this); |
| 311 while (std::unique_ptr<Cfg> Func = optQueueBlockingPop()) { | 300 while (std::unique_ptr<Cfg> Func = optQueueBlockingPop()) { |
| 312 // Install Func in TLS for Cfg-specific container allocators. | 301 // Install Func in TLS for Cfg-specific container allocators. |
| 313 CfgLocalAllocatorScope _(Func.get()); | 302 CfgLocalAllocatorScope _(Func.get()); |
| 314 // Reset per-function stats being accumulated in TLS. | 303 // Reset per-function stats being accumulated in TLS. |
| 315 resetStats(); | 304 resetStats(); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 getErrorStatus()->assign(EC_Translation); | 379 getErrorStatus()->assign(EC_Translation); |
| 391 } | 380 } |
| 392 TargetHeaderLowering::createLowering(this)->lower(); | 381 TargetHeaderLowering::createLowering(this)->lower(); |
| 393 } | 382 } |
| 394 } | 383 } |
| 395 | 384 |
| 396 void GlobalContext::lowerConstants() { DataLowering->lowerConstants(); } | 385 void GlobalContext::lowerConstants() { DataLowering->lowerConstants(); } |
| 397 | 386 |
| 398 void GlobalContext::lowerJumpTables() { DataLowering->lowerJumpTables(); } | 387 void GlobalContext::lowerJumpTables() { DataLowering->lowerJumpTables(); } |
| 399 | 388 |
| 400 void GlobalContext::addBlockInfoPtrs(VariableDeclaration *ProfileBlockInfo) { | 389 void GlobalContext::saveBlockInfoPtrs() { |
| 401 for (const VariableDeclaration *Global : Globals) { | 390 for (VariableDeclaration *Global : Globals) { |
| 402 if (Cfg::isProfileGlobal(*Global)) { | 391 if (Cfg::isProfileGlobal(*Global)) { |
| 403 constexpr RelocOffsetT BlockExecutionCounterOffset = 0; | 392 ProfileBlockInfos.push_back(Global); |
| 404 ProfileBlockInfo->addInitializer( | |
| 405 VariableDeclaration::RelocInitializer::create( | |
| 406 Global, | |
| 407 {RelocOffset::create(this, BlockExecutionCounterOffset)})); | |
| 408 } | 393 } |
| 409 } | 394 } |
| 410 } | 395 } |
| 411 | 396 |
| 412 void GlobalContext::lowerGlobals(const IceString &SectionSuffix) { | 397 void GlobalContext::lowerGlobals(const IceString &SectionSuffix) { |
| 413 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this); | 398 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this); |
| 414 const bool DumpGlobalVariables = BuildDefs::dump() && | 399 const bool DumpGlobalVariables = BuildDefs::dump() && |
| 415 (Flags.getVerbose() & IceV_GlobalInit) && | 400 (Flags.getVerbose() & IceV_GlobalInit) && |
| 416 Flags.getVerboseFocusOn().empty(); | 401 Flags.getVerboseFocusOn().empty(); |
| 417 if (DumpGlobalVariables) { | 402 if (DumpGlobalVariables) { |
| 418 OstreamLocker L(this); | 403 OstreamLocker L(this); |
| 419 Ostream &Stream = getStrDump(); | 404 Ostream &Stream = getStrDump(); |
| 420 for (const Ice::VariableDeclaration *Global : Globals) { | 405 for (const Ice::VariableDeclaration *Global : Globals) { |
| 421 Global->dump(Stream); | 406 Global->dump(Stream); |
| 422 } | 407 } |
| 423 } | 408 } |
| 424 if (Flags.getDisableTranslation()) | 409 if (Flags.getDisableTranslation()) |
| 425 return; | 410 return; |
| 426 | 411 |
| 427 addBlockInfoPtrs(ProfileBlockInfoVarDecl); | 412 saveBlockInfoPtrs(); |
| 428 // If we need to shuffle the layout of global variables, shuffle them now. | 413 // If we need to shuffle the layout of global variables, shuffle them now. |
| 429 if (getFlags().shouldReorderGlobalVariables()) { | 414 if (getFlags().shouldReorderGlobalVariables()) { |
| 430 // Create a random number generator for global variable reordering. | 415 // Create a random number generator for global variable reordering. |
| 431 RandomNumberGenerator RNG(getFlags().getRandomSeed(), | 416 RandomNumberGenerator RNG(getFlags().getRandomSeed(), |
| 432 RPE_GlobalVariableReordering); | 417 RPE_GlobalVariableReordering); |
| 433 RandomShuffle(Globals.begin(), Globals.end(), | 418 RandomShuffle(Globals.begin(), Globals.end(), |
| 434 [&RNG](int N) { return (uint32_t)RNG.next(N); }); | 419 [&RNG](int N) { return (uint32_t)RNG.next(N); }); |
| 435 } | 420 } |
| 436 DataLowering->lowerGlobals(Globals, SectionSuffix); | 421 DataLowering->lowerGlobals(Globals, SectionSuffix); |
| 437 for (VariableDeclaration *Var : Globals) { | 422 if (ProfileBlockInfos.empty() && DisposeGlobalVariablesAfterLowering) { |
| 438 Var->discardInitializers(); | 423 Globals.clearAndPurge(); |
| 424 } else { |
| 425 Globals.clear(); |
| 439 } | 426 } |
| 440 Globals.clear(); | |
| 441 } | 427 } |
| 442 | 428 |
| 443 void GlobalContext::lowerProfileData() { | 429 void GlobalContext::lowerProfileData() { |
| 444 // ProfileBlockInfoVarDecl is initialized in the constructor, and will only | 430 // ProfileBlockInfoVarDecl is initialized in the constructor, and will only |
| 445 // ever be nullptr after this method completes. This assertion is a convoluted | 431 // ever be nullptr after this method completes. This assertion is a convoluted |
| 446 // way of ensuring lowerProfileData is invoked a single time. | 432 // way of ensuring lowerProfileData is invoked a single time. |
| 447 assert(ProfileBlockInfoVarDecl != nullptr); | 433 assert(ProfileBlockInfoVarDecl == nullptr); |
| 434 |
| 435 auto GlobalVariablePool = getInitializerAllocator(); |
| 436 ProfileBlockInfoVarDecl = |
| 437 VariableDeclaration::createExternal(GlobalVariablePool.get()); |
| 438 ProfileBlockInfoVarDecl->setAlignment(typeWidthInBytes(IceType_i64)); |
| 439 ProfileBlockInfoVarDecl->setIsConstant(true); |
| 440 |
| 441 // Note: if you change this symbol, make sure to update |
| 442 // runtime/szrt_profiler.c as well. |
| 443 ProfileBlockInfoVarDecl->setName("__Sz_block_profile_info"); |
| 444 |
| 445 for (const VariableDeclaration *PBI : ProfileBlockInfos) { |
| 446 if (Cfg::isProfileGlobal(*PBI)) { |
| 447 constexpr RelocOffsetT BlockExecutionCounterOffset = 0; |
| 448 ProfileBlockInfoVarDecl->addInitializer( |
| 449 VariableDeclaration::RelocInitializer::create( |
| 450 GlobalVariablePool.get(), PBI, |
| 451 {RelocOffset::create(this, BlockExecutionCounterOffset)})); |
| 452 } |
| 453 } |
| 454 |
| 448 // This adds a 64-bit sentinel entry to the end of our array. For 32-bit | 455 // This adds a 64-bit sentinel entry to the end of our array. For 32-bit |
| 449 // architectures this will waste 4 bytes. | 456 // architectures this will waste 4 bytes. |
| 450 const SizeT Sizeof64BitNullPtr = typeWidthInBytes(IceType_i64); | 457 const SizeT Sizeof64BitNullPtr = typeWidthInBytes(IceType_i64); |
| 451 ProfileBlockInfoVarDecl->addInitializer( | 458 ProfileBlockInfoVarDecl->addInitializer( |
| 452 VariableDeclaration::ZeroInitializer::create(Sizeof64BitNullPtr)); | 459 VariableDeclaration::ZeroInitializer::create(GlobalVariablePool.get(), |
| 460 Sizeof64BitNullPtr)); |
| 453 Globals.push_back(ProfileBlockInfoVarDecl); | 461 Globals.push_back(ProfileBlockInfoVarDecl); |
| 454 constexpr char ProfileDataSection[] = "$sz_profiler$"; | 462 constexpr char ProfileDataSection[] = "$sz_profiler$"; |
| 455 lowerGlobals(ProfileDataSection); | 463 lowerGlobals(ProfileDataSection); |
| 456 ProfileBlockInfoVarDecl = nullptr; | |
| 457 } | 464 } |
| 458 | 465 |
| 459 void GlobalContext::emitItems() { | 466 void GlobalContext::emitItems() { |
| 460 const bool Threaded = !getFlags().isSequential(); | 467 const bool Threaded = !getFlags().isSequential(); |
| 461 // Pending is a vector containing the reassembled, ordered list of | 468 // Pending is a vector containing the reassembled, ordered list of |
| 462 // work items. When we're ready for the next item, we first check | 469 // work items. When we're ready for the next item, we first check |
| 463 // whether it's in the Pending list. If not, we take an item from | 470 // whether it's in the Pending list. If not, we take an item from |
| 464 // the work queue, and if it's not the item we're waiting for, we | 471 // the work queue, and if it's not the item we're waiting for, we |
| 465 // insert it into Pending and repeat. The work item is deleted | 472 // insert it into Pending and repeat. The work item is deleted |
| 466 // after it is processed. | 473 // after it is processed. |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 Ctx = Func->getContext(); | 921 Ctx = Func->getContext(); |
| 915 Active = | 922 Active = |
| 916 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); | 923 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); |
| 917 if (Active) | 924 if (Active) |
| 918 Ctx->pushTimer(ID, StackID); | 925 Ctx->pushTimer(ID, StackID); |
| 919 } | 926 } |
| 920 | 927 |
| 921 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); | 928 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); |
| 922 | 929 |
| 923 } // end of namespace Ice | 930 } // end of namespace Ice |
| OLD | NEW |