mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 01:43:57 +00:00
ARM implement TargetInstrInfo::getNoopForMachoTarget()
Without this hook, functions w/ a completely empty body (including no epilogue) will cause an MCEmitter assertion failure. For example, define internal fastcc void @empty_function() { unreachable } rdar://10947471 llvm-svn: 151673
This commit is contained in:
parent
b87aee0a04
commit
cb853fbdc9
@ -3003,3 +3003,7 @@ ARMBaseInstrInfo::setExecutionDomain(MachineInstr *MI, unsigned Domain) const {
|
||||
// This will go before any implicit ops.
|
||||
AddDefaultPred(MachineInstrBuilder(MI).addOperand(MI->getOperand(1)));
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::hasNOP() const {
|
||||
return (Subtarget.getFeatureBits() & ARM::HasV6T2Ops) != 0;
|
||||
}
|
||||
|
@ -35,6 +35,9 @@ protected:
|
||||
explicit ARMBaseInstrInfo(const ARMSubtarget &STI);
|
||||
|
||||
public:
|
||||
// Return whether the target has an explicit NOP encoding.
|
||||
bool hasNOP() const;
|
||||
|
||||
// Return the non-pre/post incrementing version of 'Opc'. Return 0
|
||||
// if there is not such an opcode.
|
||||
virtual unsigned getUnindexedOpcode(unsigned Opc) const =0;
|
||||
|
@ -21,12 +21,29 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
using namespace llvm;
|
||||
|
||||
ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(*this, STI) {
|
||||
}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void ARMInstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
if (hasNOP()) {
|
||||
NopInst.setOpcode(ARM::NOP);
|
||||
NopInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
NopInst.addOperand(MCOperand::CreateReg(0));
|
||||
} else {
|
||||
NopInst.setOpcode(ARM::MOVr);
|
||||
NopInst.addOperand(MCOperand::CreateReg(ARM::R0));
|
||||
NopInst.addOperand(MCOperand::CreateReg(ARM::R0));
|
||||
NopInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
NopInst.addOperand(MCOperand::CreateReg(0));
|
||||
NopInst.addOperand(MCOperand::CreateReg(0));
|
||||
}
|
||||
}
|
||||
|
||||
unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
||||
switch (Opc) {
|
||||
default: break;
|
||||
|
@ -28,6 +28,9 @@ class ARMInstrInfo : public ARMBaseInstrInfo {
|
||||
public:
|
||||
explicit ARMInstrInfo(const ARMSubtarget &STI);
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void getNoopForMachoTarget(MCInst &NopInst) const;
|
||||
|
||||
// Return the non-pre/post incrementing version of 'Opc'. Return 0
|
||||
// if there is not such an opcode.
|
||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "Thumb1InstrInfo.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -27,6 +27,15 @@ Thumb1InstrInfo::Thumb1InstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(*this, STI) {
|
||||
}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void Thumb1InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
NopInst.setOpcode(ARM::tMOVr);
|
||||
NopInst.addOperand(MCOperand::CreateReg(ARM::R8));
|
||||
NopInst.addOperand(MCOperand::CreateReg(ARM::R8));
|
||||
NopInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
NopInst.addOperand(MCOperand::CreateReg(0));
|
||||
}
|
||||
|
||||
unsigned Thumb1InstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
||||
return 0;
|
||||
}
|
||||
|
@ -27,6 +27,9 @@ class Thumb1InstrInfo : public ARMBaseInstrInfo {
|
||||
public:
|
||||
explicit Thumb1InstrInfo(const ARMSubtarget &STI);
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void getNoopForMachoTarget(MCInst &NopInst) const;
|
||||
|
||||
// Return the non-pre/post incrementing version of 'Opc'. Return 0
|
||||
// if there is not such an opcode.
|
||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -34,6 +35,13 @@ Thumb2InstrInfo::Thumb2InstrInfo(const ARMSubtarget &STI)
|
||||
: ARMBaseInstrInfo(STI), RI(*this, STI) {
|
||||
}
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void Thumb2InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
|
||||
NopInst.setOpcode(ARM::tNOP);
|
||||
NopInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
NopInst.addOperand(MCOperand::CreateReg(0));
|
||||
}
|
||||
|
||||
unsigned Thumb2InstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
||||
// FIXME
|
||||
return 0;
|
||||
|
@ -28,6 +28,9 @@ class Thumb2InstrInfo : public ARMBaseInstrInfo {
|
||||
public:
|
||||
explicit Thumb2InstrInfo(const ARMSubtarget &STI);
|
||||
|
||||
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
|
||||
void getNoopForMachoTarget(MCInst &NopInst) const;
|
||||
|
||||
// Return the non-pre/post incrementing version of 'Opc'. Return 0
|
||||
// if there is not such an opcode.
|
||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||
|
15
test/MC/MachO/ARM/empty-function-nop.ll
Normal file
15
test/MC/MachO/ARM/empty-function-nop.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc < %s -filetype=obj -mtriple=thumbv6-apple-darwin -o - | macho-dump -dump-section-data | FileCheck -prefix=T1
|
||||
; RUN: llc < %s -filetype=obj -mtriple=thumbv7-apple-darwin -o - | macho-dump -dump-section-data | FileCheck -prefix=T2
|
||||
; RUN: llc < %s -filetype=obj -mtriple=armv6-apple-darwin -o - | macho-dump -dump-section-data | FileCheck -prefix=ARM
|
||||
; RUN: llc < %s -filetype=obj -mtriple=armv7-apple-darwin -o - | macho-dump -dump-section-data | FileCheck -prefix=ARMV7
|
||||
|
||||
; Empty functions need a NOP in them for MachO to prevent DWARF FDEs from
|
||||
; getting all mucked up. See lib/CodeGen/AsmPrinter/AsmPrinter.cpp for
|
||||
; details.
|
||||
define internal fastcc void @empty_function() {
|
||||
unreachable
|
||||
}
|
||||
; CHECK-T1: ('_section_data', 'c046')
|
||||
; CHECK-T2: ('_section_data', '00bf')
|
||||
; CHECK-ARM: ('_section_data', '0000a0e1')
|
||||
; CHECK-ARMV7: ('_section_data', '00f020e3')
|
Loading…
x
Reference in New Issue
Block a user