| Index: src/IceGlobalContext.cpp
|
| diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp
|
| index 45fb999aec667b8bc7c7bc4d26ea3e4a7ce1427a..7aa36d99136a8efe61f7834ff83ccce69398bc1c 100644
|
| --- a/src/IceGlobalContext.cpp
|
| +++ b/src/IceGlobalContext.cpp
|
| @@ -372,6 +372,11 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError,
|
| }
|
| }
|
|
|
| +void GlobalContext::translateFunctionsWrapper(ThreadContext *MyTLS) {
|
| + ICE_TLS_SET_FIELD(TLS, MyTLS);
|
| + translateFunctions();
|
| +}
|
| +
|
| void GlobalContext::translateFunctions() {
|
| TimerMarker Timer(TimerStack::TT_translateFunctions, this);
|
| while (std::unique_ptr<OptWorkItem> OptItem = optQueueBlockingPop()) {
|
| @@ -454,6 +459,11 @@ void resizePending(std::vector<std::unique_ptr<EmitterWorkItem>> *Pending,
|
|
|
| } // end of anonymous namespace
|
|
|
| +// static
|
| +void GlobalContext::TlsInit() {
|
| + ICE_TLS_INIT_FIELD(TLS);
|
| +}
|
| +
|
| void GlobalContext::emitFileHeader() {
|
| TimerMarker T1(Ice::TimerStack::TT_emitAsm, this);
|
| if (getFlags().getOutFileType() == FT_Elf) {
|
| @@ -556,6 +566,11 @@ void GlobalContext::lowerProfileData() {
|
| lowerGlobals(ProfileDataSection);
|
| }
|
|
|
| +void GlobalContext::emitterWrapper(ThreadContext *MyTLS) {
|
| + ICE_TLS_SET_FIELD(TLS, MyTLS);
|
| + emitItems();
|
| +}
|
| +
|
| void GlobalContext::emitItems() {
|
| const bool Threaded = !getFlags().isSequential();
|
| // Pending is a vector containing the reassembled, ordered list of
|
| @@ -987,6 +1002,38 @@ std::unique_ptr<EmitterWorkItem> GlobalContext::emitQueueBlockingPop() {
|
| return EmitQ.blockingPop();
|
| }
|
|
|
| +void GlobalContext::initParserThread() {
|
| + ThreadContext *Tls = new ThreadContext();
|
| + auto Timers = getTimers();
|
| + Timers->initInto(Tls->Timers);
|
| + AllThreadContexts.push_back(Tls);
|
| + ICE_TLS_SET_FIELD(TLS, Tls);
|
| +}
|
| +
|
| +void GlobalContext::startWorkerThreads() {
|
| + size_t NumWorkers = getFlags().getNumTranslationThreads();
|
| + auto Timers = getTimers();
|
| + for (size_t i = 0; i < NumWorkers; ++i) {
|
| + ThreadContext *WorkerTLS = new ThreadContext();
|
| + Timers->initInto(WorkerTLS->Timers);
|
| + AllThreadContexts.push_back(WorkerTLS);
|
| + TranslationThreads.push_back(std::thread(
|
| + &GlobalContext::translateFunctionsWrapper, this, WorkerTLS));
|
| + }
|
| + if (NumWorkers) {
|
| + ThreadContext *WorkerTLS = new ThreadContext();
|
| + Timers->initInto(WorkerTLS->Timers);
|
| + AllThreadContexts.push_back(WorkerTLS);
|
| + EmitterThreads.push_back(
|
| + std::thread(&GlobalContext::emitterWrapper, this, WorkerTLS));
|
| + }
|
| +}
|
| +
|
| +void GlobalContext::resetStats() {
|
| + if (BuildDefs::dump())
|
| + ICE_TLS_GET_FIELD(TLS)->StatsFunction.reset();
|
| +}
|
| +
|
| void GlobalContext::dumpStats(const Cfg *Func) {
|
| if (!getFlags().getDumpStats())
|
| return;
|
| @@ -997,6 +1044,54 @@ void GlobalContext::dumpStats(const Cfg *Func) {
|
| }
|
| }
|
|
|
| +void GlobalContext::statsUpdateEmitted(uint32_t InstCount) {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_InstCount, InstCount);
|
| + Tls->StatsCumulative.update(CodeStats::CS_InstCount, InstCount);
|
| +}
|
| +
|
| +void GlobalContext::statsUpdateRegistersSaved(uint32_t Num) {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_RegsSaved, Num);
|
| + Tls->StatsCumulative.update(CodeStats::CS_RegsSaved, Num);
|
| +}
|
| +
|
| +void GlobalContext::statsUpdateFrameBytes(uint32_t Bytes) {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_FrameByte, Bytes);
|
| + Tls->StatsCumulative.update(CodeStats::CS_FrameByte, Bytes);
|
| +}
|
| +
|
| +void GlobalContext::statsUpdateSpills() {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_NumSpills);
|
| + Tls->StatsCumulative.update(CodeStats::CS_NumSpills);
|
| +}
|
| +
|
| +void GlobalContext::statsUpdateFills() {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_NumFills);
|
| + Tls->StatsCumulative.update(CodeStats::CS_NumFills);
|
| +}
|
| +
|
| +void GlobalContext::statsUpdateRPImms() {
|
| + if (!getFlags().getDumpStats())
|
| + return;
|
| + ThreadContext *Tls = ICE_TLS_GET_FIELD(TLS);
|
| + Tls->StatsFunction.update(CodeStats::CS_NumRPImms);
|
| + Tls->StatsCumulative.update(CodeStats::CS_NumRPImms);
|
| +}
|
| +
|
| void GlobalContext::dumpTimers(TimerStackIdT StackID, bool DumpCumulative) {
|
| if (!BuildDefs::timers())
|
| return;
|
|
|