[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