1c9b1f062SMaksim Panchenko //===- bolt/Rewrite/MetadataManager.cpp -----------------------------------===// 2c9b1f062SMaksim Panchenko // 3c9b1f062SMaksim Panchenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c9b1f062SMaksim Panchenko // See https://llvm.org/LICENSE.txt for license information. 5c9b1f062SMaksim Panchenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c9b1f062SMaksim Panchenko // 7c9b1f062SMaksim Panchenko //===----------------------------------------------------------------------===// 8c9b1f062SMaksim Panchenko 9c9b1f062SMaksim Panchenko #include "bolt/Rewrite/MetadataManager.h" 10c9b1f062SMaksim Panchenko #include "llvm/Support/Debug.h" 11c9b1f062SMaksim Panchenko 12c9b1f062SMaksim Panchenko #undef DEBUG_TYPE 13c9b1f062SMaksim Panchenko #define DEBUG_TYPE "bolt-metadata" 14c9b1f062SMaksim Panchenko 15c9b1f062SMaksim Panchenko using namespace llvm; 16c9b1f062SMaksim Panchenko using namespace bolt; 17c9b1f062SMaksim Panchenko registerRewriter(std::unique_ptr<MetadataRewriter> Rewriter)18c9b1f062SMaksim Panchenkovoid MetadataManager::registerRewriter( 19c9b1f062SMaksim Panchenko std::unique_ptr<MetadataRewriter> Rewriter) { 20c9b1f062SMaksim Panchenko Rewriters.emplace_back(std::move(Rewriter)); 21c9b1f062SMaksim Panchenko } 22c9b1f062SMaksim Panchenko runSectionInitializers()23*8ea59ec6SMaksim Panchenkovoid MetadataManager::runSectionInitializers() { 24*8ea59ec6SMaksim Panchenko for (auto &Rewriter : Rewriters) { 25*8ea59ec6SMaksim Panchenko LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName() 26*8ea59ec6SMaksim Panchenko << " after reading sections\n"); 27*8ea59ec6SMaksim Panchenko if (Error E = Rewriter->sectionInitializer()) { 28*8ea59ec6SMaksim Panchenko errs() << "BOLT-ERROR: while running " << Rewriter->getName() 29*8ea59ec6SMaksim Panchenko << " after reading sections: " << toString(std::move(E)) << '\n'; 30*8ea59ec6SMaksim Panchenko exit(1); 31*8ea59ec6SMaksim Panchenko } 32*8ea59ec6SMaksim Panchenko } 33*8ea59ec6SMaksim Panchenko } 34*8ea59ec6SMaksim Panchenko runInitializersPreCFG()35c9b1f062SMaksim Panchenkovoid MetadataManager::runInitializersPreCFG() { 36c9b1f062SMaksim Panchenko for (auto &Rewriter : Rewriters) { 37c9b1f062SMaksim Panchenko LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName() 38c9b1f062SMaksim Panchenko << " before CFG construction\n"); 39c9b1f062SMaksim Panchenko if (Error E = Rewriter->preCFGInitializer()) { 40c9b1f062SMaksim Panchenko errs() << "BOLT-ERROR: while running " << Rewriter->getName() 41c9b1f062SMaksim Panchenko << " in pre-CFG state: " << toString(std::move(E)) << '\n'; 42c9b1f062SMaksim Panchenko exit(1); 43c9b1f062SMaksim Panchenko } 44c9b1f062SMaksim Panchenko } 45c9b1f062SMaksim Panchenko } 46c9b1f062SMaksim Panchenko runInitializersPostCFG()47dd630d83SMaksim Panchenkovoid MetadataManager::runInitializersPostCFG() { 48dd630d83SMaksim Panchenko for (auto &Rewriter : Rewriters) { 49dd630d83SMaksim Panchenko LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName() 50dd630d83SMaksim Panchenko << " after CFG construction\n"); 51dd630d83SMaksim Panchenko if (Error E = Rewriter->postCFGInitializer()) { 52dd630d83SMaksim Panchenko errs() << "BOLT-ERROR: while running " << Rewriter->getName() 53dd630d83SMaksim Panchenko << " in CFG state: " << toString(std::move(E)) << '\n'; 54dd630d83SMaksim Panchenko exit(1); 55dd630d83SMaksim Panchenko } 56dd630d83SMaksim Panchenko } 57dd630d83SMaksim Panchenko } 58dd630d83SMaksim Panchenko runFinalizersPreEmit()59aa1968c2SMaksim Panchenkovoid MetadataManager::runFinalizersPreEmit() { 60aa1968c2SMaksim Panchenko for (auto &Rewriter : Rewriters) { 61aa1968c2SMaksim Panchenko LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName() 62aa1968c2SMaksim Panchenko << " before emitting binary context\n"); 63aa1968c2SMaksim Panchenko if (Error E = Rewriter->preEmitFinalizer()) { 64aa1968c2SMaksim Panchenko errs() << "BOLT-ERROR: while running " << Rewriter->getName() 65aa1968c2SMaksim Panchenko << " before emit: " << toString(std::move(E)) << '\n'; 66aa1968c2SMaksim Panchenko exit(1); 67aa1968c2SMaksim Panchenko } 68aa1968c2SMaksim Panchenko } 69aa1968c2SMaksim Panchenko } 70aa1968c2SMaksim Panchenko runFinalizersAfterEmit()71c9b1f062SMaksim Panchenkovoid MetadataManager::runFinalizersAfterEmit() { 72c9b1f062SMaksim Panchenko for (auto &Rewriter : Rewriters) { 73c9b1f062SMaksim Panchenko LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName() 74c9b1f062SMaksim Panchenko << " after emit\n"); 75c9b1f062SMaksim Panchenko if (Error E = Rewriter->postEmitFinalizer()) { 76c9b1f062SMaksim Panchenko errs() << "BOLT-ERROR: while running " << Rewriter->getName() 77c9b1f062SMaksim Panchenko << " after emit: " << toString(std::move(E)) << '\n'; 78c9b1f062SMaksim Panchenko exit(1); 79c9b1f062SMaksim Panchenko } 80c9b1f062SMaksim Panchenko } 81c9b1f062SMaksim Panchenko } 82