Handle ARM machine constantpool entries.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58671 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp
index 53385d9..68a36ae 100644
--- a/lib/Target/ARM/ARMCodeEmitter.cpp
+++ b/lib/Target/ARM/ARMCodeEmitter.cpp
@@ -158,7 +158,7 @@
   TD = ((ARMTargetMachine&)MF.getTarget()).getTargetData();
   JTI = ((ARMTargetMachine&)MF.getTarget()).getJITInfo();
   MCPEs = &MF.getConstantPool()->getConstants();
-  JTI->ResizeConstPoolMap(MCPEs->size());
+  JTI->Initialize(MCPEs);
 
   do {
     DOUT << "JITTing function '" << MF.getFunction()->getName() << "'\n";
@@ -257,7 +257,7 @@
 }
 
 void ARMCodeEmitter::emitInstruction(const MachineInstr &MI) {
-  DOUT << "JIT: " << "0x" << MCE.getCurrentPCValue() << ":\t" << MI;
+  DOUT << "JIT: " << (void*)MCE.getCurrentPCValue() << ":\t" << MI;
 
   NumEmitted++;  // Keep track of the # of mi's emitted
   if ((MI.getDesc().TSFlags & ARMII::FormMask) == ARMII::Pseudo)
@@ -286,8 +286,10 @@
     GlobalValue *GV = ACPV->getGV();
     if (GV) {
       assert(!ACPV->isStub() && "Don't know how to deal this yet!");
-      emitGlobalAddress(GV, ARM::reloc_arm_absolute, false);
-    } else  {
+      MCE.addRelocation(MachineRelocation::getGV(MCE.getCurrentPCOffset(),
+                                                ARM::reloc_arm_machine_cp_entry,
+                                                GV, CPIndex, false));
+     } else  {
       assert(!ACPV->isNonLazyPointer() && "Don't know how to deal this yet!");
       emitExternalSymbolAddress(ACPV->getSymbol(), ARM::reloc_arm_absolute);
     }
@@ -320,6 +322,12 @@
     emitConstPoolInstruction(MI);
     break;
   case ARM::PICADD: {
+    // Remember of the address of the PC label for relocation later.
+    const MachineOperand &MO2 = MI.getOperand(2);
+    DOUT << "\t** LPC" << MO2.getImm() << " @ "
+         << (void*)MCE.getCurrentPCValue() << '\n';
+    JTI->addPCLabelAddr(MO2.getImm(), MCE.getCurrentPCValue());
+
     // PICADD is just an add instruction that implicitly read pc.
     unsigned Binary = getBinaryCodeForInstr(MI);
     const TargetInstrDesc &TID = MI.getDesc();