::: HACK ALERT ::: HACK ALERT ::: HACK ALERT ::: HACK ALERT ::: HACK ALERT :::
authorMisha Brukman <brukman+llvm@gmail.com>
Fri, 6 Jun 2003 06:59:55 +0000 (06:59 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Fri, 6 Jun 2003 06:59:55 +0000 (06:59 +0000)
The JIT is designed to code-generate a function at-a-time. That means that any
pass can only make local changes to its function. Period.

Because the Sparc PreSelection pass claims to be a BasicBlock pass while adding
globals to the Module, it cannot be run with the other passes, because by this
time, the globals have been output already by the JIT, and the addresses of any
globals appearing AFTER this point are not recognized.

However, the PreSelection pass is a requirement for correctness in the Sparc
codegen path, so it MUST be run.

::: HACK ALERT ::: HACK ALERT ::: HACK ALERT ::: HACK ALERT ::: HACK ALERT :::

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6650 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/JIT.cpp

index 2e7236b5d500692b73d9497d774393ee8a331441..fd41c4c1273aa18a2043b6259ba47c714429bb95 100644 (file)
@@ -11,6 +11,9 @@
 #include "llvm/Module.h"
 #include "Support/CommandLine.h"
 
+// FIXME: REMOVE THIS
+#include "llvm/PassManager.h"
+
 namespace {
   cl::opt<std::string>
   Arch("march", cl::desc("Architecture: `x86' or `sparc'"), cl::Prefix,
@@ -27,7 +30,6 @@ namespace {
 
 }
 
-
 /// createJIT - Create an return a new JIT compiler if there is one available
 /// for the current target.  Otherwise it returns null.
 ///
@@ -65,6 +67,17 @@ VM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
   MCE = createEmitter(*this);
 
   setupPassManager();
+
+  // THIS GOES BEYOND UGLY HACKS
+  if (TM.getName() == "UltraSparc-Native") {
+    extern Pass *createPreSelectionPass(TargetMachine &TM);
+    PassManager PM;
+    // Specialize LLVM code for this target machine and then
+    // run basic dataflow optimizations on LLVM code.
+    PM.add(createPreSelectionPass(TM));
+    PM.run(*M);
+  }
+
   emitGlobals();
 }