uint64_t Size, uint64_t &Target) const override {
// We only handle PCRel branches for now.
if (Info->get(Inst.getOpcode()).OpInfo[0].OperandType!=MCOI::OPERAND_PCREL)
- return false;\r
-\r
- int64_t Imm = Inst.getOperand(0).getImm();\r
- Target = Addr+Imm+8; // In ARM mode the PC is always off by 8 bytes.\r
- return true;\r
- }\r
-};\r
-\r
-class ThumbMCInstrAnalysis : public ARMMCInstrAnalysis {\r
-public:\r
- ThumbMCInstrAnalysis(const MCInstrInfo *Info) : ARMMCInstrAnalysis(Info) {}\r
-\r
- bool evaluateBranch(const MCInst &Inst, uint64_t Addr,\r
- uint64_t Size, uint64_t &Target) const override {\r
- // We only handle PCRel branches for now.\r
- if (Info->get(Inst.getOpcode()).OpInfo[0].OperandType!=MCOI::OPERAND_PCREL)\r
- return false;\r
-\r
- int64_t Imm = Inst.getOperand(0).getImm();\r
- Target = Addr+Imm+4; // In Thumb mode the PC is always off by 4 bytes.\r
- return true;\r
- }\r
-};\r
-\r
-}\r
-\r
-static MCInstrAnalysis *createARMMCInstrAnalysis(const MCInstrInfo *Info) {\r
- return new ARMMCInstrAnalysis(Info);\r
-}\r
-\r
-static MCInstrAnalysis *createThumbMCInstrAnalysis(const MCInstrInfo *Info) {\r
- return new ThumbMCInstrAnalysis(Info);\r
-}\r
-\r
-// Force static initialization.\r
-extern "C" void LLVMInitializeARMTargetMC() {\r
- for (Target *T : {&getTheARMLETarget(), &getTheARMBETarget(),\r
+ return false;
+
+ int64_t Imm = Inst.getOperand(0).getImm();
+ // FIXME: This is not right for thumb.
+ Target = Addr+Imm+8; // In ARM mode the PC is always off by 8 bytes.
+ return true;
+ }
+};
+
+}
+
+static MCInstrAnalysis *createARMMCInstrAnalysis(const MCInstrInfo *Info) {
+ return new ARMMCInstrAnalysis(Info);
+}
+
+// Force static initialization.
+extern "C" void LLVMInitializeARMTargetMC() {
+ for (Target *T : {&getTheARMLETarget(), &getTheARMBETarget(),
&getTheThumbLETarget(), &getTheThumbBETarget()}) {
// Register the MC asm info.
RegisterMCAsmInfoFn X(*T, createARMMCAsmInfo);
TargetRegistry::RegisterMCRegInfo(*T, createARMMCRegisterInfo);
// Register the MC subtarget info.
- TargetRegistry::RegisterMCSubtargetInfo(*T,\r
- ARM_MC::createARMMCSubtargetInfo);\r
-\r
- TargetRegistry::RegisterELFStreamer(*T, createELFStreamer);\r
- TargetRegistry::RegisterCOFFStreamer(*T, createARMWinCOFFStreamer);\r
- TargetRegistry::RegisterMachOStreamer(*T, createARMMachOStreamer);\r
+ TargetRegistry::RegisterMCSubtargetInfo(*T,
+ ARM_MC::createARMMCSubtargetInfo);
+
+ // Register the MC instruction analyzer.
+ TargetRegistry::RegisterMCInstrAnalysis(*T, createARMMCInstrAnalysis);
+
+ TargetRegistry::RegisterELFStreamer(*T, createELFStreamer);
+ TargetRegistry::RegisterCOFFStreamer(*T, createARMWinCOFFStreamer);
+ TargetRegistry::RegisterMachOStreamer(*T, createARMMachOStreamer);
// Register the obj target streamer.
TargetRegistry::RegisterObjectTargetStreamer(*T,
TargetRegistry::RegisterMCInstPrinter(*T, createARMMCInstPrinter);
// Register the MC relocation info.
- TargetRegistry::RegisterMCRelocationInfo(*T, createARMMCRelocationInfo);\r
- }\r
-\r
- // Register the MC instruction analyzer.\r
- for (Target *T : {&getTheARMLETarget(), &getTheARMBETarget()})\r
- TargetRegistry::RegisterMCInstrAnalysis(*T, createARMMCInstrAnalysis);\r
- for (Target *T : {&getTheThumbLETarget(), &getTheThumbBETarget()})\r
- TargetRegistry::RegisterMCInstrAnalysis(*T, createThumbMCInstrAnalysis);\r
-\r
- // Register the MC Code Emitter\r
- for (Target *T : {&getTheARMLETarget(), &getTheThumbLETarget()})\r
- TargetRegistry::RegisterMCCodeEmitter(*T, createARMLEMCCodeEmitter);\r
+ TargetRegistry::RegisterMCRelocationInfo(*T, createARMMCRelocationInfo);
+ }
+
+ // Register the MC Code Emitter
+ for (Target *T : {&getTheARMLETarget(), &getTheThumbLETarget()})
+ TargetRegistry::RegisterMCCodeEmitter(*T, createARMLEMCCodeEmitter);
for (Target *T : {&getTheARMBETarget(), &getTheThumbBETarget()})
TargetRegistry::RegisterMCCodeEmitter(*T, createARMBEMCCodeEmitter);
.global target
.thumb_func
-branch24t:\r
- b target\r
-\r
-@ CHECK-ENCODING-LABEL: branch24t:\r
-@ CHECK-ENCODING-NEXT: b.w #0\r
-\r
- .thumb_func\r
-branch20t:\r
- bcc target\r
-\r
-@ CHECK-ENCODING-LABEL: branch20t:\r
-@ CHECK-ENCODING-NEXT: blo.w #0\r
-\r
- .thumb_func\r
-blx23t:\r
- bl target\r
-\r
-@ CHECK-ENCODING-LABEL: blx23t:\r
-@ CHECK-ENCODING-NEXT: bl #0\r
-\r
- .thumb_func\r
+branch24t:
+ b target
+
+@ CHECK-ENCODING-LABEL: branch24t
+@ CHECK-ENCODING-NEXT: b.w #0
+
+ .thumb_func
+branch20t:
+ bcc target
+
+@ CHECK-ENCODING-LABEL: branch20t
+@ CHECK-ENCODING-NEXT: blo.w #0
+
+ .thumb_func
+blx23t:
+ bl target
+
+@ CHECK-ENCODING-LABEL: blx23t
+@ CHECK-ENCODING-NEXT: bl #0
+
+ .thumb_func
mov32t:
movw r0, :lower16:target
- movt r0, :upper16:target\r
- blx r0\r
-\r
-@ CHECK-ENCODING-LABEL: mov32t:\r
-@ CHECK-ENCODING-NEXT: movw r0, #0\r
-@ CHECK-ENCODING-NEXT: movt r0, #0\r
-@ CHECK-ENCODING-NEXT: blx r0\r
+ movt r0, :upper16:target
+ blx r0
+
+@ CHECK-ENCODING-LABEL: mov32t
+@ CHECK-ENCODING-NEXT: movw r0, #0
+@ CHECK-ENCODING-NEXT: movt r0, #0
+@ CHECK-ENCODING-NEXT: blx r0
.thumb_func
addr32:
ldr r0, .Laddr32
bx r0
trap
-.Laddr32:\r
- .long target\r
-\r
-@ CHECK-ENCODING-LABEL: addr32:\r
-@ CHECK-ENCODING-NEXT: ldr r0, [pc, #4]\r
-@ CHECK-ENCODING-NEXT: bx r0\r
-@ CHECK-ENCODING-NEXT: trap\r
+.Laddr32:
+ .long target
+
+@ CHECK-ENCODING-LABEL: addr32
+@ CHECK-ENCODING-NEXT: ldr r0, [pc, #4]
+@ CHECK-ENCODING-NEXT: bx r0
+@ CHECK-ENCODING-NEXT: trap
@ CHECK-ENCODING-NEXT: movs r0, r0
@ CHECK-ENCODING-NEXT: movs r0, r0
ldr r0, .Laddr32nb
bx r0
trap
-.Laddr32nb:\r
- .long target(imgrel)\r
-\r
-@ CHECK-ENCODING-LABEL: addr32nb:\r
-@ CHECK-ENCODING-NEXT: ldr.w r0, [pc, #4]\r
-@ CHECK-ENCODING-NEXT: bx r0\r
-@ CHECK-ENCODING-NEXT: trap\r
+.Laddr32nb:
+ .long target(imgrel)
+
+@ CHECK-ENCODING-LABEL: addr32nb
+@ CHECK-ENCODING-NEXT: ldr.w r0, [pc, #4]
+@ CHECK-ENCODING-NEXT: bx r0
+@ CHECK-ENCODING-NEXT: trap
@ CHECK-ENCODING-NEXT: movs r0, r0
@ CHECK-ENCODING-NEXT: movs r0, r0
ldr r0, .Lsecrel
bx r0
trap
-.Lsecrel:\r
- .long target(secrel32)\r
-\r
-@ CHECK-ENCODING-LABEL: secrel:\r
-@ CHECK-ENCODING-NEXT: ldr.w r0, [pc, #4]\r
-@ CHECK-ENCODING-NEXT: bx r0\r
-@ CHECK-ENCODING-NEXT: trap\r
+.Lsecrel:
+ .long target(secrel32)
+
+@ CHECK-ENCODING-LABEL: secrel
+@ CHECK-ENCODING-NEXT: ldr.w r0, [pc, #4]
+@ CHECK-ENCODING-NEXT: bx r0
+@ CHECK-ENCODING-NEXT: trap
@ CHECK-ENCODING-NEXT: movs r0, r0
@ CHECK-ENCODING-NEXT: movs r0, r0