[LLVMdev] Adding fixups and relocations late in code generation
Jack Carter
jcarter at mips.com
Mon Oct 10 10:11:51 PDT 2011
Gang,
I'm tasked with direct object generation for Mips and am trying to not
hack the code.
I how exactly does one set an expression to be PC relative and if the
compiler can resolve it, not produce a relocation?
In our case, the backend produces an expression for the branch which is
the target label. I make a call from the .td for the branch instruction
which calls a routine in MipsMCCodeEmmitter.cpp. That routine
##############################################################
unsigned MipsMCCodeEmitter::
getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
SmallVectorImpl<MCFixup> &Fixups) const {
const MCOperand &MO = MI.getOperand(OpNo);
if (MO.isReg()) {
unsigned Reg = MO.getReg();
unsigned RegNo = getMipsRegisterNumbering(Reg);
return RegNo;
} else if (MO.isImm()) {
return static_cast<unsigned>(MO.getImm());
} else if (MO.isFPImm()) {
return static_cast<unsigned>(APFloat(MO.getFPImm())
.bitcastToAPInt().getHiBits(32).getLimitedValue());
} else if (MO.isExpr()) {
const MCExpr *p_expr = MO.getExpr();
Fixups.push_back(MCFixup::Create(0, p_expr,
MCFixupKind(Mips::fixup_Mips_Branch_PCRel)));
}
return 0;
}
############################################
Later in MipsAsmBackend.cpp:ApplyFixup() I find the value is the offset
of the target value from the beginning of the section and not the delta
from the branch address.
I also get a relocation request even though the label should be
resolved.
So, I must not be telling the compiler what to do when setting up the
relocation. What am I doing wrong here?
As a hack, I calculate the delta in ApplyFixup() but it should have been
done before ApplyFixup(). In ApplyFixup() I believe I just need to
adjust the final value for Mips idiosyncrasies like shifting the delta 2
bits to the right.
I would really like to become fluent in clean llvm expression building.
Thanks,
Jack
More information about the llvm-dev
mailing list