Fix X86FastISel's output for x86-32 PIC constant pool addresses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56829 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2008-09-30 01:21:32 +00:00
parent 57c3dac0df
commit 5396c99baa
2 changed files with 17 additions and 6 deletions

View File

@ -1217,9 +1217,18 @@ unsigned X86FastISel::TargetMaterializeConstant(Constant *C) {
Align = Log2_64(Align); Align = Log2_64(Align);
} }
// x86-32 PIC requires a PIC base register for constant pools.
unsigned PICBase = 0;
if (TM.getRelocationModel() == Reloc::PIC_ &&
!Subtarget->is64Bit())
PICBase = getInstrInfo()->getGlobalBaseReg(&MF);
// Create the load from the constant pool.
unsigned MCPOffset = MCP.getConstantPoolIndex(C, Align); unsigned MCPOffset = MCP.getConstantPoolIndex(C, Align);
unsigned ResultReg = createResultReg(RC); unsigned ResultReg = createResultReg(RC);
addConstantPoolReference(BuildMI(MBB, TII.get(Opc), ResultReg), MCPOffset); addConstantPoolReference(BuildMI(MBB, TII.get(Opc), ResultReg), MCPOffset,
PICBase);
return ResultReg; return ResultReg;
} }

View File

@ -114,13 +114,15 @@ addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {
/// addConstantPoolReference - This function is used to add a reference to the /// addConstantPoolReference - This function is used to add a reference to the
/// base of a constant value spilled to the per-function constant pool. The /// base of a constant value spilled to the per-function constant pool. The
/// reference has base register ConstantPoolIndex offset which is retained until /// reference uses the abstract ConstantPoolIndex which is retained until
/// either machine code emission or assembly output. This allows an optional /// either machine code emission or assembly output. In PIC mode on x86-32,
/// offset to be added as well. /// the GlobalBaseReg parameter can be used to make this a
/// GlobalBaseReg-relative reference.
/// ///
inline const MachineInstrBuilder & inline const MachineInstrBuilder &
addConstantPoolReference(const MachineInstrBuilder &MIB, unsigned CPI) { addConstantPoolReference(const MachineInstrBuilder &MIB, unsigned CPI,
return MIB.addReg(0).addImm(1).addReg(0).addConstantPoolIndex(CPI); unsigned GlobalBaseReg = 0) {
return MIB.addReg(GlobalBaseReg).addImm(1).addReg(0).addConstantPoolIndex(CPI);
} }
} // End llvm namespace } // End llvm namespace