diff gen/optimizer.cpp @ 1287:6c8af78364f5

There's an issue with LLVM metadata support; it triggers an assert when trying to generate asm for code with metadata globals. This new pass is used as a workaround: it strips metadata from the module before it reaches the code generator. Obviously, this is disabled if LLVM doesn't support metadata.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 02 May 2009 12:19:43 +0200
parents 91d9386d4a5a
children e109e4031e8a
line wrap: on
line diff
--- a/gen/optimizer.cpp	Sat May 02 11:58:50 2009 +0200
+++ b/gen/optimizer.cpp	Sat May 02 12:19:43 2009 +0200
@@ -50,6 +50,12 @@
     cl::desc("Disable promotion of GC allocations to stack memory in -O<N>"),
     cl::ZeroOrMore);
 
+// Not recommended; metadata currently triggers an assert in the backend...
+static cl::opt<bool>
+disableStripMetaData("disable-strip-metadata",
+    cl::desc("Disable default metadata stripping (not recommended)"),
+    cl::ZeroOrMore);
+
 static cl::opt<opts::BoolOrDefaultAdapter, false, opts::FlagParser>
 enableInlining("inlining",
     cl::desc("(*) Enable function inlining in -O<N>"),
@@ -137,6 +143,13 @@
             pm.add(createCFGSimplificationPass());
         }
     }
+#ifdef USE_METADATA
+    if (!disableStripMetaData) {
+        // This one is purposely not disabled by disableLangSpecificPasses
+        // because the code generator will assert if it's not used.
+        pm.add(createStripMetaData());
+    }
+#endif
 
     // -O3
     if (optimizeLevel >= 3)
@@ -181,8 +194,18 @@
 // Returns true if any optimization passes were invoked.
 bool ldc_optimize_module(llvm::Module* m)
 {
-    if (!optimize())
+    if (!optimize()) {
+#ifdef 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.
+            ModulePass* stripMD = createStripMetaData();
+            stripMD->runOnModule(*m);
+            delete stripMD;
+        }
+#endif
         return false;
+    }
 
     PassManager pm;
     pm.add(new TargetData(m));