Implement branching to a PC-relative constant (not a BasicBlock).
authorMisha Brukman <brukman+llvm@gmail.com>
Fri, 7 Nov 2003 21:07:30 +0000 (21:07 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Fri, 7 Nov 2003 21:07:30 +0000 (21:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9793 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9CodeEmitter.cpp

index a674d8a00ccdc0c9f73ed646c5f9b7b4193feb05..5863fd67b46763c2d165760815616026de068681 100644 (file)
@@ -593,8 +593,13 @@ int64_t SparcV9CodeEmitter::getMachineOpValue(MachineInstr &MI,
       unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
       BBRefs.push_back(std::make_pair(BB, std::make_pair(CurrPC, &MI)));
     } else if (const Constant *C = dyn_cast<Constant>(V)) {
-      std::cerr << "ERROR: constants should not appear in PcRel:" << MO << "\n";
-      abort();
+      if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
+        rv = CI->getRawValue() - MCE.getCurrentPCValue();
+      } else {
+        std::cerr << "Cannot have non-integral const in instruction: "
+                  << *C;
+        abort();
+      }
     } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
       // same as MO.isGlobalAddress()
       DEBUG(std::cerr << "GlobalValue: ");
@@ -797,11 +802,6 @@ void* SparcV9CodeEmitter::getGlobalAddress(GlobalValue *V, MachineInstr &MI,
         // Delayed resolution...
         return 
           (void*)(intptr_t)TheJITResolver->getLazyResolver(cast<Function>(V));
-
-      } else if (Constant *C = ConstantPointerRef::get(V)) {
-        // no longer applicable
-        std::cerr << "Unhandled Constant: " << *C << "\n";
-        abort();
       } else {
         std::cerr << "Unhandled global: " << *V << "\n";
         abort();