20
20
#include " llvm/MC/MCAsmBackend.h"
21
21
#include " llvm/MC/MCCodeEmitter.h"
22
22
#include " llvm/MC/MCContext.h"
23
+ #include " llvm/MC/MCInstrAnalysis.h"
23
24
#include " llvm/MC/MCInstrInfo.h"
24
25
#include " llvm/MC/MCObjectWriter.h"
25
26
#include " llvm/MC/MCRegisterInfo.h"
@@ -103,6 +104,35 @@ static MCStreamer *createMCStreamer(const Triple &T, MCContext &Context,
103
104
std::move (Emitter), RelaxAll);
104
105
}
105
106
107
+ namespace {
108
+
109
+ class AMDGPUMCInstrAnalysis : public MCInstrAnalysis {
110
+ public:
111
+ explicit AMDGPUMCInstrAnalysis (const MCInstrInfo *Info)
112
+ : MCInstrAnalysis(Info) {}
113
+
114
+ bool evaluateBranch (const MCInst &Inst, uint64_t Addr, uint64_t Size,
115
+ uint64_t &Target) const override {
116
+ if (Inst.getNumOperands () == 0 || !Inst.getOperand (0 ).isImm () ||
117
+ Info->get (Inst.getOpcode ()).OpInfo [0 ].OperandType !=
118
+ MCOI::OPERAND_PCREL)
119
+ return false ;
120
+
121
+ int64_t Imm = Inst.getOperand (0 ).getImm ();
122
+ // Our branches take a simm16, but we need two extra bits to account for
123
+ // the factor of 4.
124
+ APInt SignedOffset (18 , Imm * 4 , true );
125
+ Target = (SignedOffset.sext (64 ) + Addr + Size).getZExtValue ();
126
+ return true ;
127
+ }
128
+ };
129
+
130
+ } // end anonymous namespace
131
+
132
+ static MCInstrAnalysis *createAMDGPUMCInstrAnalysis (const MCInstrInfo *Info) {
133
+ return new AMDGPUMCInstrAnalysis (Info);
134
+ }
135
+
106
136
extern " C" void LLVMInitializeAMDGPUTargetMC () {
107
137
108
138
TargetRegistry::RegisterMCInstrInfo (getTheGCNTarget (), createAMDGPUMCInstrInfo);
@@ -113,6 +143,7 @@ extern "C" void LLVMInitializeAMDGPUTargetMC() {
113
143
TargetRegistry::RegisterMCRegInfo (*T, createAMDGPUMCRegisterInfo);
114
144
TargetRegistry::RegisterMCSubtargetInfo (*T, createAMDGPUMCSubtargetInfo);
115
145
TargetRegistry::RegisterMCInstPrinter (*T, createAMDGPUMCInstPrinter);
146
+ TargetRegistry::RegisterMCInstrAnalysis (*T, createAMDGPUMCInstrAnalysis);
116
147
TargetRegistry::RegisterMCAsmBackend (*T, createAMDGPUAsmBackend);
117
148
TargetRegistry::RegisterELFStreamer (*T, createMCStreamer);
118
149
}
0 commit comments