# HG changeset patch # User Tomas Lindquist Olsen # Date 1249032511 -7200 # Node ID 3adcb70700cb9573087bea63da148905735f6b3c # Parent d11aeae19b9529692ab785e5df85c828340587a6 Added back option to disable metadata generation and users. Set USE_METADATA to OFF in ccmake. diff -r d11aeae19b95 -r 3adcb70700cb CMakeLists.txt --- a/CMakeLists.txt Fri Jul 31 01:44:47 2009 +0200 +++ b/CMakeLists.txt Fri Jul 31 11:28:31 2009 +0200 @@ -64,6 +64,7 @@ set(PROGRAM_SUFFIX CACHE STRING "appended to ldc binary name") option(USE_BOEHM_GC "use the Boehm garbage collector internally") option(GENERATE_OFFTI "generate complete ClassInfo.offTi arrays") +option(USE_METADATA "use metadata and related custom optimization passes") if(D_VERSION EQUAL 1) set(DMDFE_PATH dmd) @@ -208,6 +209,10 @@ add_definitions(-DGENERATE_OFFTI) endif(GENERATE_OFFTI) +if(USE_METADATA) + add_definitions(-DUSE_METADATA) +endif(USE_METADATA) + if(CMAKE_MINOR_VERSION LESS 6) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "output dir for built executables") set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib CACHE PATH "output dir for built libraries") diff -r d11aeae19b95 -r 3adcb70700cb gen/main.cpp --- a/gen/main.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/main.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -941,12 +941,13 @@ std::string errormsg; for (int i = 0; i < llvmModules.size(); i++) { +#if USE_METADATA //FIXME: workaround for llvm metadata bug: // the LinkInModule call asserts with metadata unstripped llvm::ModulePass* stripMD = createStripMetaData(); stripMD->runOnModule(*llvmModules[i]); delete stripMD; - +#endif // USE_METADATA if(linker.LinkInModule(llvmModules[i], &errormsg)) error("%s", errormsg.c_str()); delete llvmModules[i]; diff -r d11aeae19b95 -r 3adcb70700cb gen/metadata.h --- a/gen/metadata.h Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/metadata.h Fri Jul 31 11:28:31 2009 +0200 @@ -1,3 +1,5 @@ +#if USE_METADATA + #ifndef LDC_GEN_METADATA_H #define LDC_GEN_METADATA_H @@ -46,3 +48,5 @@ }; #endif + +#endif // USE_METADATA diff -r d11aeae19b95 -r 3adcb70700cb gen/optimizer.cpp --- a/gen/optimizer.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/optimizer.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -160,8 +160,10 @@ if (!disableSimplifyRuntimeCalls) addPass(pm, createSimplifyDRuntimeCalls()); +#if USE_METADATA if (!disableGCToStack) addPass(pm, createGarbageCollect2Stack()); +#endif // USE_METADATA } // Run some clean-up passes addPass(pm, createInstructionCombiningPass()); @@ -221,6 +223,7 @@ bool ldc_optimize_module(llvm::Module* m) { if (!optimize()) { +#if USE_METADATA if (!disableStripMetaData) { // This one always needs to run if metadata is generated, because // the code generator will assert if it's not used. @@ -228,6 +231,7 @@ stripMD->runOnModule(*m); delete stripMD; } +#endif return false; } @@ -266,11 +270,13 @@ if (optimize) addPassesForOptLevel(pm); +#if USE_METADATA if (!disableStripMetaData) { // This one is purposely not disabled by disableLangSpecificPasses // because the code generator will assert if it's not used. addPass(pm, createStripMetaData()); } +#endif // USE_METADATA pm.run(*m); return true; diff -r d11aeae19b95 -r 3adcb70700cb gen/passes/GarbageCollect2Stack.cpp --- a/gen/passes/GarbageCollect2Stack.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/passes/GarbageCollect2Stack.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -1,3 +1,5 @@ +#if USE_METADATA + //===- GarbageCollect2Stack - Optimize calls to the D garbage collector ---===// // // The LLVM D Compiler @@ -642,3 +644,5 @@ // All uses examined - not captured or live across original allocation. return true; } + +#endif // USE_METADATA diff -r d11aeae19b95 -r 3adcb70700cb gen/passes/Passes.h --- a/gen/passes/Passes.h Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/passes/Passes.h Fri Jul 31 11:28:31 2009 +0200 @@ -10,8 +10,10 @@ // Performs simplifications on runtime calls. llvm::FunctionPass* createSimplifyDRuntimeCalls(); +#if USE_METADATA llvm::FunctionPass* createGarbageCollect2Stack(); llvm::ModulePass* createStripMetaData(); +#endif // USE_METADATA llvm::ModulePass* createStripExternalsPass(); diff -r d11aeae19b95 -r 3adcb70700cb gen/passes/StripMetaData.cpp --- a/gen/passes/StripMetaData.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/passes/StripMetaData.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -1,3 +1,5 @@ +#if USE_METADATA + //===- StripMetaData - Strips D-specific metadata -------------------------===// // // The LLVM D Compiler @@ -75,3 +77,5 @@ } return Changed; } + +#endif // USE_METADATA diff -r d11aeae19b95 -r 3adcb70700cb gen/typinf.cpp --- a/gen/typinf.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/gen/typinf.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -302,6 +302,7 @@ tid->ir.irGlobal = irg; +#if USE_METADATA // don't do this for void or llvm will crash if (tid->tinfo->ty != Tvoid) { // Add some metadata for use by optimization passes. @@ -321,6 +322,7 @@ llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module); } } +#endif // USE_METADATA DtoDeclareTypeInfo(tid); } diff -r d11aeae19b95 -r 3adcb70700cb ir/irclass.cpp --- a/ir/irclass.cpp Fri Jul 31 01:44:47 2009 +0200 +++ b/ir/irclass.cpp Fri Jul 31 11:28:31 2009 +0200 @@ -71,6 +71,7 @@ classInfo = new llvm::GlobalVariable( *gIR->module, tc->getPA().get(), false, _linkage, NULL, initname); +#if USE_METADATA // Generate some metadata on this ClassInfo if it's for a class. ClassDeclaration* classdecl = aggrdecl->isClassDeclaration(); if (classdecl && !aggrdecl->isInterfaceDeclaration()) { @@ -90,6 +91,7 @@ std::string metaname = CD_PREFIX + initname; llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module); } +#endif // USE_METADATA return classInfo; }