From 4753b87f606680a510ce9c0f705b2cacbcba6742 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 10 Sep 2014 21:27:43 +0000 Subject: [PATCH] Add doInitialization/doFinalization to DataLayoutPass. With this a DataLayoutPass can be reused for multiple modules. Once we have doInitialization/doFinalization, it doesn't seem necessary to pass a Module to the constructor. Overall this change seems in line with the idea of making DataLayout a required part of Module. With it the only way of having a DataLayout used is to add it to the Module. llvm-svn: 217548 --- examples/ExceptionDemo/ExceptionDemo.cpp | 2 +- examples/Kaleidoscope/Chapter4/toy.cpp | 2 +- examples/Kaleidoscope/Chapter5/toy.cpp | 2 +- examples/Kaleidoscope/Chapter6/toy.cpp | 2 +- examples/Kaleidoscope/Chapter7/toy.cpp | 2 +- include/llvm/IR/DataLayout.h | 11 +++++------ lib/ExecutionEngine/MCJIT/MCJIT.cpp | 2 +- lib/IR/DataLayout.cpp | 18 +++++++++++------- lib/LTO/LTOCodeGenerator.cpp | 2 +- lib/Target/Target.cpp | 2 +- lib/Target/TargetMachineC.cpp | 2 +- lib/Transforms/IPO/PassManagerBuilder.cpp | 3 +-- tools/gold/gold-plugin.cpp | 2 +- tools/llc/llc.cpp | 2 +- tools/llvm-extract/llvm-extract.cpp | 2 +- tools/opt/opt.cpp | 4 ++-- unittests/IR/LegacyPassManagerTest.cpp | 10 +++++----- 17 files changed, 36 insertions(+), 34 deletions(-) diff --git a/examples/ExceptionDemo/ExceptionDemo.cpp b/examples/ExceptionDemo/ExceptionDemo.cpp index e5e2c923d73..17076facbca 100644 --- a/examples/ExceptionDemo/ExceptionDemo.cpp +++ b/examples/ExceptionDemo/ExceptionDemo.cpp @@ -1977,7 +1977,7 @@ int main(int argc, char *argv[]) { // Start with registering info about how the // target lays out data structures. module->setDataLayout(executionEngine->getDataLayout()); - fpm.add(new llvm::DataLayoutPass(module)); + fpm.add(new llvm::DataLayoutPass()); // Optimizations turned on #ifdef ADD_OPT_PASSES diff --git a/examples/Kaleidoscope/Chapter4/toy.cpp b/examples/Kaleidoscope/Chapter4/toy.cpp index 9daaaa7466f..3564d751e65 100644 --- a/examples/Kaleidoscope/Chapter4/toy.cpp +++ b/examples/Kaleidoscope/Chapter4/toy.cpp @@ -588,7 +588,7 @@ int main() { // Set up the optimizer pipeline. Start with registering info about how the // target lays out data structures. TheModule->setDataLayout(TheExecutionEngine->getDataLayout()); - OurFPM.add(new DataLayoutPass(TheModule)); + OurFPM.add(new DataLayoutPass()); // Provide basic AliasAnalysis support for GVN. OurFPM.add(createBasicAliasAnalysisPass()); // Do simple "peephole" optimizations and bit-twiddling optzns. diff --git a/examples/Kaleidoscope/Chapter5/toy.cpp b/examples/Kaleidoscope/Chapter5/toy.cpp index 5454b21bece..4929a20cd7e 100644 --- a/examples/Kaleidoscope/Chapter5/toy.cpp +++ b/examples/Kaleidoscope/Chapter5/toy.cpp @@ -833,7 +833,7 @@ int main() { // Set up the optimizer pipeline. Start with registering info about how the // target lays out data structures. TheModule->setDataLayout(TheExecutionEngine->getDataLayout()); - OurFPM.add(new DataLayoutPass(TheModule)); + OurFPM.add(new DataLayoutPass()); // Provide basic AliasAnalysis support for GVN. OurFPM.add(createBasicAliasAnalysisPass()); // Do simple "peephole" optimizations and bit-twiddling optzns. diff --git a/examples/Kaleidoscope/Chapter6/toy.cpp b/examples/Kaleidoscope/Chapter6/toy.cpp index 8977203a719..06da9ac682d 100644 --- a/examples/Kaleidoscope/Chapter6/toy.cpp +++ b/examples/Kaleidoscope/Chapter6/toy.cpp @@ -951,7 +951,7 @@ int main() { // Set up the optimizer pipeline. Start with registering info about how the // target lays out data structures. TheModule->setDataLayout(TheExecutionEngine->getDataLayout()); - OurFPM.add(new DataLayoutPass(TheModule)); + OurFPM.add(new DataLayoutPass()); // Provide basic AliasAnalysis support for GVN. OurFPM.add(createBasicAliasAnalysisPass()); // Do simple "peephole" optimizations and bit-twiddling optzns. diff --git a/examples/Kaleidoscope/Chapter7/toy.cpp b/examples/Kaleidoscope/Chapter7/toy.cpp index 3550a0d8a5b..56a6fa96e25 100644 --- a/examples/Kaleidoscope/Chapter7/toy.cpp +++ b/examples/Kaleidoscope/Chapter7/toy.cpp @@ -1115,7 +1115,7 @@ int main() { // Set up the optimizer pipeline. Start with registering info about how the // target lays out data structures. TheModule->setDataLayout(TheExecutionEngine->getDataLayout()); - OurFPM.add(new DataLayoutPass(TheModule)); + OurFPM.add(new DataLayoutPass()); // Provide basic AliasAnalysis support for GVN. OurFPM.add(createBasicAliasAnalysisPass()); // Promote allocas to registers. diff --git a/include/llvm/IR/DataLayout.h b/include/llvm/IR/DataLayout.h index 877029f92f0..4ed10e0be9a 100644 --- a/include/llvm/IR/DataLayout.h +++ b/include/llvm/IR/DataLayout.h @@ -184,6 +184,8 @@ public: /// Initialize target data from properties stored in the module. explicit DataLayout(const Module *M); + void init(const Module *M); + DataLayout(const DataLayout &DL) : LayoutMap(nullptr) { *this = DL; } DataLayout &operator=(const DataLayout &DL) { @@ -466,13 +468,10 @@ public: const DataLayout &getDataLayout() const { return DL; } - // For use with the C API. C++ code should always use the constructor that - // takes a module. - explicit DataLayoutPass(const DataLayout &DL); - - explicit DataLayoutPass(const Module *M); - static char ID; // Pass identification, replacement for typeid + + bool doFinalization(Module &M) override; + bool doInitialization(Module &M) override; }; /// StructLayout - used to lazily calculate structure layout information for a diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 8ff41ffd7d6..e441ec8d1a3 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -133,7 +133,7 @@ std::unique_ptr MCJIT::emitObject(Module *M) { PassManager PM; M->setDataLayout(TM->getSubtargetImpl()->getDataLayout()); - PM.add(new DataLayoutPass(M)); + PM.add(new DataLayoutPass()); // The RuntimeDyld will take ownership of this shortly std::unique_ptr CompiledObject(new ObjectBufferStream()); diff --git a/lib/IR/DataLayout.cpp b/lib/IR/DataLayout.cpp index dea05fbef4a..38873538670 100644 --- a/lib/IR/DataLayout.cpp +++ b/lib/IR/DataLayout.cpp @@ -345,6 +345,10 @@ void DataLayout::parseSpecifier(StringRef Desc) { } DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) { + init(M); +} + +void DataLayout::init(const Module *M) { const DataLayout *Other = M->getDataLayout(); if (Other) *this = *Other; @@ -796,17 +800,17 @@ unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const { } DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") { - report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a " - "DataLayout to use?"); + initializeDataLayoutPassPass(*PassRegistry::getPassRegistry()); } DataLayoutPass::~DataLayoutPass() {} -DataLayoutPass::DataLayoutPass(const DataLayout &DL) - : ImmutablePass(ID), DL(DL) { - initializeDataLayoutPassPass(*PassRegistry::getPassRegistry()); +bool DataLayoutPass::doInitialization(Module &M) { + DL.init(&M); + return false; } -DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) { - initializeDataLayoutPassPass(*PassRegistry::getPassRegistry()); +bool DataLayoutPass::doFinalization(Module &M) { + DL.reset(""); + return false; } diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 491975e3db6..1b6f905f0ac 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -471,7 +471,7 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, PassManager codeGenPasses; - codeGenPasses.add(new DataLayoutPass(mergedModule)); + codeGenPasses.add(new DataLayoutPass()); formatted_raw_ostream Out(out); diff --git a/lib/Target/Target.cpp b/lib/Target/Target.cpp index d277f82eb86..4b51b3f7eea 100644 --- a/lib/Target/Target.cpp +++ b/lib/Target/Target.cpp @@ -49,7 +49,7 @@ LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { void LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) { // The DataLayoutPass must now be in sync with the module. Unfortunatelly we // cannot enforce that from the C api. - unwrap(PM)->add(new DataLayoutPass(*unwrap(TD))); + unwrap(PM)->add(new DataLayoutPass()); } void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI, diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp index 598783b1be1..b3e07df7b5b 100644 --- a/lib/Target/TargetMachineC.cpp +++ b/lib/Target/TargetMachineC.cpp @@ -198,7 +198,7 @@ static LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M, return true; } Mod->setDataLayout(td); - pass.add(new DataLayoutPass(Mod)); + pass.add(new DataLayoutPass()); TargetMachine::CodeGenFileType ft; switch (codegen) { diff --git a/lib/Transforms/IPO/PassManagerBuilder.cpp b/lib/Transforms/IPO/PassManagerBuilder.cpp index 1b229123233..1b9d8c16060 100644 --- a/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -432,8 +432,7 @@ void PassManagerBuilder::addLTOOptimizationPasses(PassManagerBase &PM) { void PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM, TargetMachine *TM) { if (TM) { - const DataLayout *DL = TM->getSubtargetImpl()->getDataLayout(); - PM.add(new DataLayoutPass(*DL)); + PM.add(new DataLayoutPass()); TM->addAnalysisPasses(PM); } diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index e7888bea9e6..abe6e4dd66b 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -693,7 +693,7 @@ static void codegen(Module &M) { runLTOPasses(M, *TM); PassManager CodeGenPasses; - CodeGenPasses.add(new DataLayoutPass(&M)); + CodeGenPasses.add(new DataLayoutPass()); SmallString<128> Filename; int FD; diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 0dbe215cef7..fe4d9ac4f19 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -307,7 +307,7 @@ static int compileModule(char **argv, LLVMContext &Context) { // Add the target data from the target machine, if it exists, or the module. if (const DataLayout *DL = Target.getSubtargetImpl()->getDataLayout()) mod->setDataLayout(DL); - PM.add(new DataLayoutPass(mod)); + PM.add(new DataLayoutPass()); if (RelaxAll.getNumOccurrences() > 0 && FileType != TargetMachine::CGFT_ObjectFile) diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp index 8da63fb1797..116b678e07e 100644 --- a/tools/llvm-extract/llvm-extract.cpp +++ b/tools/llvm-extract/llvm-extract.cpp @@ -250,7 +250,7 @@ int main(int argc, char **argv) { // In addition to deleting all other functions, we also want to spiff it // up a little bit. Do this now. PassManager Passes; - Passes.add(new DataLayoutPass(M.get())); // Use correct DataLayout + Passes.add(new DataLayoutPass()); // Use correct DataLayout std::vector Gvs(GVs.begin(), GVs.end()); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index f8172b51207..f1a945a6000 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -440,7 +440,7 @@ int main(int argc, char **argv) { } if (DL) - Passes.add(new DataLayoutPass(M.get())); + Passes.add(new DataLayoutPass()); Triple ModuleTriple(M->getTargetTriple()); TargetMachine *Machine = nullptr; @@ -456,7 +456,7 @@ int main(int argc, char **argv) { if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { FPasses.reset(new FunctionPassManager(M.get())); if (DL) - FPasses->add(new DataLayoutPass(M.get())); + FPasses->add(new DataLayoutPass()); if (TM.get()) TM->addAnalysisPasses(*FPasses); diff --git a/unittests/IR/LegacyPassManagerTest.cpp b/unittests/IR/LegacyPassManagerTest.cpp index 7a2c47a59f9..4efc2f5b805 100644 --- a/unittests/IR/LegacyPassManagerTest.cpp +++ b/unittests/IR/LegacyPassManagerTest.cpp @@ -303,7 +303,7 @@ namespace llvm { mNDM->run = mNDNM->run = mDNM->run = mNDM2->run = 0; PassManager Passes; - Passes.add(new DataLayoutPass(&M)); + Passes.add(new DataLayoutPass()); Passes.add(mNDM2); Passes.add(mNDM); Passes.add(mNDNM); @@ -327,7 +327,7 @@ namespace llvm { mNDM->run = mNDNM->run = mDNM->run = mNDM2->run = 0; PassManager Passes; - Passes.add(new DataLayoutPass(&M)); + Passes.add(new DataLayoutPass()); Passes.add(mNDM); Passes.add(mNDNM); Passes.add(mNDM2);// invalidates mNDM needed by mDNM @@ -349,7 +349,7 @@ namespace llvm { std::unique_ptr M(makeLLVMModule()); T *P = new T(); PassManager Passes; - Passes.add(new DataLayoutPass(M.get())); + Passes.add(new DataLayoutPass()); Passes.add(P); Passes.run(*M); T::finishedOK(run); @@ -360,7 +360,7 @@ namespace llvm { Module *M = makeLLVMModule(); T *P = new T(); PassManager Passes; - Passes.add(new DataLayoutPass(M)); + Passes.add(new DataLayoutPass()); Passes.add(P); Passes.run(*M); T::finishedOK(run, N); @@ -398,7 +398,7 @@ namespace llvm { SCOPED_TRACE("Running OnTheFlyTest"); struct OnTheFlyTest *O = new OnTheFlyTest(); PassManager Passes; - Passes.add(new DataLayoutPass(M)); + Passes.add(new DataLayoutPass()); Passes.add(O); Passes.run(*M);