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

llvm-svn: 56829
This commit is contained in:
Dan Gohman 2008-09-30 01:21:32 +00:00
parent c28f40a821
commit b5824675e4
2 changed files with 17 additions and 6 deletions

View File

@ -1217,9 +1217,18 @@ unsigned X86FastISel::TargetMaterializeConstant(Constant *C) {
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 ResultReg = createResultReg(RC);
addConstantPoolReference(BuildMI(MBB, TII.get(Opc), ResultReg), MCPOffset);
addConstantPoolReference(BuildMI(MBB, TII.get(Opc), ResultReg), MCPOffset,
PICBase);
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
/// base of a constant value spilled to the per-function constant pool. The
/// reference has base register ConstantPoolIndex offset which is retained until
/// either machine code emission or assembly output. This allows an optional
/// offset to be added as well.
/// reference uses the abstract ConstantPoolIndex which is retained until
/// either machine code emission or assembly output. In PIC mode on x86-32,
/// the GlobalBaseReg parameter can be used to make this a
/// GlobalBaseReg-relative reference.
///
inline const MachineInstrBuilder &
addConstantPoolReference(const MachineInstrBuilder &MIB, unsigned CPI) {
return MIB.addReg(0).addImm(1).addReg(0).addConstantPoolIndex(CPI);
addConstantPoolReference(const MachineInstrBuilder &MIB, unsigned CPI,
unsigned GlobalBaseReg = 0) {
return MIB.addReg(GlobalBaseReg).addImm(1).addReg(0).addConstantPoolIndex(CPI);
}
} // End llvm namespace