From 5d5a1e13a129e18ee6031fe6354acd2ab4d39f37 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 10 Feb 2010 04:47:08 +0000 Subject: [PATCH] MC: Switch MCFixup to just hold an MCExpr pointer instead of index into the MCInst it came from. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95767 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCFixup.h | 27 ++++++++++++++------------- lib/MC/MCAsmStreamer.cpp | 2 +- lib/Target/X86/X86CodeEmitter.cpp | 12 ++++++++---- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/include/llvm/MC/MCFixup.h b/include/llvm/MC/MCFixup.h index 6763c054c05..f325d655001 100644 --- a/include/llvm/MC/MCFixup.h +++ b/include/llvm/MC/MCFixup.h @@ -13,6 +13,7 @@ #include namespace llvm { +class MCExpr; // Private constants, do not use. // @@ -25,10 +26,8 @@ namespace llvm { // end up needing more bits for target dependent kinds. enum { MCFIXUP_NUM_GENERIC_KINDS = 128, - MCFIXUP_NUM_KIND_BITS = 8, - MCFIXUP_NUM_OPINDEX_BITS = 8, - MCFIXUP_NUM_OFFSET_BITS = (32 - MCFIXUP_NUM_OPINDEX_BITS - - MCFIXUP_NUM_OPINDEX_BITS) + MCFIXUP_NUM_KIND_BITS = 16, + MCFIXUP_NUM_OFFSET_BITS = (32 - MCFIXUP_NUM_KIND_BITS) }; /// MCFixupKind - Extensible enumeration to represent the type of a fixup. @@ -60,34 +59,36 @@ enum MCFixupKind { class MCFixup { static const unsigned MaxOffset = 1 << MCFIXUP_NUM_KIND_BITS; + /// The value to put into the fixup location. The exact interpretation of the + /// expression is target dependent, usually it will one of the operands to an + /// instruction or an assembler directive. + const MCExpr *Value; + /// The byte index of start of the relocation inside the encoded instruction. unsigned Offset : MCFIXUP_NUM_OFFSET_BITS; - /// The index of the operand to encode into the instruction. - unsigned OpIndex : MCFIXUP_NUM_OPINDEX_BITS; - /// The target dependent kind of fixup item this is. The kind is used to /// determine how the operand value should be encoded into the instruction. unsigned Kind : MCFIXUP_NUM_KIND_BITS; public: - static MCFixup Create(unsigned Offset, unsigned OpIndex, MCFixupKind Kind) { + static MCFixup Create(unsigned Offset, const MCExpr *Value, + MCFixupKind Kind) { MCFixup FI; + FI.Value = Value; FI.Offset = Offset; - FI.OpIndex = OpIndex; FI.Kind = unsigned(Kind); assert(Offset == FI.getOffset() && "Offset out of range!"); - assert(OpIndex == FI.getOpIndex() && "Operand index out of range!"); assert(Kind == FI.getKind() && "Kind out of range!"); return FI; } + MCFixupKind getKind() const { return MCFixupKind(Kind); } + unsigned getOffset() const { return Offset; } - unsigned getOpIndex() const { return OpIndex; } - - MCFixupKind getKind() const { return MCFixupKind(Kind); } + const MCExpr *getValue() const { return Value; } }; } // End llvm namespace diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 3e3d1e59ed3..828377f42cc 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -601,7 +601,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) { MCFixup &F = Fixups[i]; MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind()); OS << " fixup " << char('A' + i) << " - " << "offset: " << F.getOffset() - << ", op: " << F.getOpIndex() << ", kind: " << Info.Name << "\n"; + << ", value: " << *F.getValue() << ", kind: " << Info.Name << "\n"; } } diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index ae035640df0..f0bceb1483f 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -878,12 +878,14 @@ void Emitter::emitInstruction(const MachineInstr &MI, namespace { class MCSingleInstructionCodeEmitter : public MachineCodeEmitter { uint8_t Data[256]; + const MCInst *CurrentInst; SmallVectorImpl *FixupList; public: - MCSingleInstructionCodeEmitter() { reset(0); } + MCSingleInstructionCodeEmitter() { reset(0, 0); } - void reset(SmallVectorImpl *Fixups) { + void reset(const MCInst *Inst, SmallVectorImpl *Fixups) { + CurrentInst = Inst; FixupList = Fixups; BufferBegin = Data; BufferEnd = array_endof(Data); @@ -915,7 +917,9 @@ public: OpIndex = MR.getJumpTableIndex(); } - FixupList->push_back(MCFixup::Create(Offset, OpIndex, + MCOperand Op = CurrentInst->getOperand(OpIndex); + assert(Op.isExpr() && "FIXME: Not yet implemented!"); + FixupList->push_back(MCFixup::Create(Offset, Op.getExpr(), MCFixupKind(FirstTargetFixupKind + Kind))); } virtual void setModuleInfo(MachineModuleInfo* Info) {} @@ -1163,7 +1167,7 @@ public: Instr->dump(); } - InstrEmitter->reset(&Fixups); + InstrEmitter->reset(&MI, &Fixups); if (OK) Emit->emitInstruction(*Instr, &Desc); OS << InstrEmitter->str();