Replace PROLOG_LABEL with a new CFI_INSTRUCTION.

The old system was fairly convoluted:
* A temporary label was created.
* A single PROLOG_LABEL was created with it.
* A few MCCFIInstructions were created with the same label.

The semantics were that the cfi instructions were mapped to the PROLOG_LABEL
via the temporary label. The output position was that of the PROLOG_LABEL.
The temporary label itself was used only for doing the mapping.

The new CFI_INSTRUCTION has a 1:1 mapping to MCCFIInstructions and points to
one by holding an index into the CFI instructions of this function.

I did consider removing MMI.getFrameInstructions completelly and having
CFI_INSTRUCTION own a MCCFIInstruction, but MCCFIInstructions have non
trivial constructors and destructors and are somewhat big, so the this setup
is probably better.

The net result is that we don't create temporary labels that are never used.

llvm-svn: 203204
This commit is contained in:
Rafael Espindola 2014-03-07 06:08:31 +00:00
parent c994c6a35b
commit b1f25f1b93
45 changed files with 340 additions and 337 deletions

View File

@ -208,7 +208,7 @@ namespace llvm {
/// function. /// function.
void EmitFunctionBody(); void EmitFunctionBody();
void emitPrologLabel(const MachineInstr &MI); void emitCFIInstruction(const MachineInstr &MI);
enum CFIMoveType { enum CFIMoveType {
CFI_M_None, CFI_M_None,

View File

@ -637,19 +637,19 @@ public:
/// bundle remain bundled. /// bundle remain bundled.
void eraseFromBundle(); void eraseFromBundle();
/// isLabel - Returns true if the MachineInstr represents a label.
///
bool isLabel() const {
return getOpcode() == TargetOpcode::PROLOG_LABEL ||
getOpcode() == TargetOpcode::EH_LABEL ||
getOpcode() == TargetOpcode::GC_LABEL;
}
bool isPrologLabel() const {
return getOpcode() == TargetOpcode::PROLOG_LABEL;
}
bool isEHLabel() const { return getOpcode() == TargetOpcode::EH_LABEL; } bool isEHLabel() const { return getOpcode() == TargetOpcode::EH_LABEL; }
bool isGCLabel() const { return getOpcode() == TargetOpcode::GC_LABEL; } bool isGCLabel() const { return getOpcode() == TargetOpcode::GC_LABEL; }
/// isLabel - Returns true if the MachineInstr represents a label.
///
bool isLabel() const { return isEHLabel() || isGCLabel(); }
bool isCFIInstruction() const {
return getOpcode() == TargetOpcode::CFI_INSTRUCTION;
}
// True if the instruction represents a position in the function.
bool isPosition() const { return isLabel() || isCFIInstruction(); }
bool isDebugValue() const { return getOpcode() == TargetOpcode::DBG_VALUE; } bool isDebugValue() const { return getOpcode() == TargetOpcode::DBG_VALUE; }
/// A DBG_VALUE is indirect iff the first operand is a register and /// A DBG_VALUE is indirect iff the first operand is a register and
/// the second operand is an immediate. /// the second operand is an immediate.
@ -715,7 +715,7 @@ public:
// Pseudo-instructions that don't produce any real output. // Pseudo-instructions that don't produce any real output.
case TargetOpcode::IMPLICIT_DEF: case TargetOpcode::IMPLICIT_DEF:
case TargetOpcode::KILL: case TargetOpcode::KILL:
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
case TargetOpcode::GC_LABEL: case TargetOpcode::GC_LABEL:
case TargetOpcode::DBG_VALUE: case TargetOpcode::DBG_VALUE:

View File

@ -172,7 +172,12 @@ public:
MI->addOperand(*MF, MachineOperand::CreateMetadata(MD)); MI->addOperand(*MF, MachineOperand::CreateMetadata(MD));
return *this; return *this;
} }
const MachineInstrBuilder &addCFIIndex(unsigned CFIIndex) const {
MI->addOperand(*MF, MachineOperand::CreateCFIIndex(CFIIndex));
return *this;
}
const MachineInstrBuilder &addSym(MCSymbol *Sym) const { const MachineInstrBuilder &addSym(MCSymbol *Sym) const {
MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym)); MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym));
return *this; return *this;

View File

@ -238,8 +238,10 @@ public:
return FrameInstructions; return FrameInstructions;
} }
void addFrameInst(const MCCFIInstruction &Inst) { unsigned LLVM_ATTRIBUTE_UNUSED_RESULT
addFrameInst(const MCCFIInstruction &Inst) {
FrameInstructions.push_back(Inst); FrameInstructions.push_back(Inst);
return FrameInstructions.size() - 1;
} }
/// getCompactUnwindEncoding - Returns the compact unwind encoding for a /// getCompactUnwindEncoding - Returns the compact unwind encoding for a

View File

@ -58,7 +58,8 @@ public:
MO_RegisterMask, ///< Mask of preserved registers. MO_RegisterMask, ///< Mask of preserved registers.
MO_RegisterLiveOut, ///< Mask of live-out registers. MO_RegisterLiveOut, ///< Mask of live-out registers.
MO_Metadata, ///< Metadata reference (for debug info) MO_Metadata, ///< Metadata reference (for debug info)
MO_MCSymbol ///< MCSymbol reference (for debug/eh info) MO_MCSymbol, ///< MCSymbol reference (for debug/eh info)
MO_CFIIndex ///< MCCFIInstruction index.
}; };
private: private:
@ -156,7 +157,8 @@ private:
int64_t ImmVal; // For MO_Immediate. int64_t ImmVal; // For MO_Immediate.
const uint32_t *RegMask; // For MO_RegisterMask and MO_RegisterLiveOut. const uint32_t *RegMask; // For MO_RegisterMask and MO_RegisterLiveOut.
const MDNode *MD; // For MO_Metadata. const MDNode *MD; // For MO_Metadata.
MCSymbol *Sym; // For MO_MCSymbol MCSymbol *Sym; // For MO_MCSymbol.
unsigned CFIIndex; // For MO_CFI.
struct { // For MO_Register. struct { // For MO_Register.
// Register number is in SmallContents.RegNo. // Register number is in SmallContents.RegNo.
@ -252,7 +254,7 @@ public:
/// isMetadata - Tests if this is a MO_Metadata operand. /// isMetadata - Tests if this is a MO_Metadata operand.
bool isMetadata() const { return OpKind == MO_Metadata; } bool isMetadata() const { return OpKind == MO_Metadata; }
bool isMCSymbol() const { return OpKind == MO_MCSymbol; } bool isMCSymbol() const { return OpKind == MO_MCSymbol; }
bool isCFIIndex() const { return OpKind == MO_CFIIndex; }
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// Accessors for Register Operands // Accessors for Register Operands
@ -443,6 +445,11 @@ public:
return Contents.Sym; return Contents.Sym;
} }
unsigned getCFIIndex() const {
assert(isCFIIndex() && "Wrong MachineOperand accessor");
return Contents.CFIIndex;
}
/// getOffset - Return the offset from the symbol in this operand. This always /// getOffset - Return the offset from the symbol in this operand. This always
/// returns 0 for ExternalSymbol operands. /// returns 0 for ExternalSymbol operands.
int64_t getOffset() const { int64_t getOffset() const {
@ -686,6 +693,12 @@ public:
return Op; return Op;
} }
static MachineOperand CreateCFIIndex(unsigned CFIIndex) {
MachineOperand Op(MachineOperand::MO_CFIIndex);
Op.Contents.CFIIndex = CFIIndex;
return Op;
}
friend class MachineInstr; friend class MachineInstr;
friend class MachineRegisterInfo; friend class MachineRegisterInfo;
private: private:

View File

@ -714,7 +714,7 @@ def INLINEASM : Instruction {
let AsmString = ""; let AsmString = "";
let neverHasSideEffects = 1; // Note side effect is encoded in an operand. let neverHasSideEffects = 1; // Note side effect is encoded in an operand.
} }
def PROLOG_LABEL : Instruction { def CFI_INSTRUCTION : Instruction {
let OutOperandList = (outs); let OutOperandList = (outs);
let InOperandList = (ins i32imm:$id); let InOperandList = (ins i32imm:$id);
let AsmString = ""; let AsmString = "";

View File

@ -25,7 +25,7 @@ namespace TargetOpcode {
enum { enum {
PHI = 0, PHI = 0,
INLINEASM = 1, INLINEASM = 1,
PROLOG_LABEL = 2, CFI_INSTRUCTION = 2,
EH_LABEL = 3, EH_LABEL = 3,
GC_LABEL = 4, GC_LABEL = 4,

View File

@ -699,9 +699,7 @@ bool AsmPrinter::needsSEHMoves() {
MF->getFunction()->needsUnwindTableEntry(); MF->getFunction()->needsUnwindTableEntry();
} }
void AsmPrinter::emitPrologLabel(const MachineInstr &MI) { void AsmPrinter::emitCFIInstruction(const MachineInstr &MI) {
const MCSymbol *Label = MI.getOperand(0).getMCSymbol();
ExceptionHandling::ExceptionsType ExceptionHandlingType = ExceptionHandling::ExceptionsType ExceptionHandlingType =
MAI->getExceptionHandlingType(); MAI->getExceptionHandlingType();
if (ExceptionHandlingType != ExceptionHandling::DwarfCFI && if (ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
@ -716,16 +714,9 @@ void AsmPrinter::emitPrologLabel(const MachineInstr &MI) {
const MachineModuleInfo &MMI = MF->getMMI(); const MachineModuleInfo &MMI = MF->getMMI();
const std::vector<MCCFIInstruction> &Instrs = MMI.getFrameInstructions(); const std::vector<MCCFIInstruction> &Instrs = MMI.getFrameInstructions();
bool FoundOne = false; unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
(void)FoundOne; const MCCFIInstruction &CFI = Instrs[CFIIndex];
for (std::vector<MCCFIInstruction>::const_iterator I = Instrs.begin(), emitCFIInstruction(CFI);
E = Instrs.end(); I != E; ++I) {
if (I->getLabel() == Label) {
emitCFIInstruction(*I);
FoundOne = true;
}
}
assert(FoundOne);
} }
/// EmitFunctionBody - This method emits the body and trailer for a /// EmitFunctionBody - This method emits the body and trailer for a
@ -748,7 +739,7 @@ void AsmPrinter::EmitFunctionBody() {
LastMI = II; LastMI = II;
// Print the assembly for the instruction. // Print the assembly for the instruction.
if (!II->isLabel() && !II->isImplicitDef() && !II->isKill() && if (!II->isPosition() && !II->isImplicitDef() && !II->isKill() &&
!II->isDebugValue()) { !II->isDebugValue()) {
HasAnyRealCode = true; HasAnyRealCode = true;
++EmittedInsts; ++EmittedInsts;
@ -767,8 +758,8 @@ void AsmPrinter::EmitFunctionBody() {
emitComments(*II, OutStreamer.GetCommentOS()); emitComments(*II, OutStreamer.GetCommentOS());
switch (II->getOpcode()) { switch (II->getOpcode()) {
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
emitPrologLabel(*II); emitCFIInstruction(*II);
break; break;
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
@ -811,7 +802,7 @@ void AsmPrinter::EmitFunctionBody() {
// label equaling the end of function label and an invalid "row" in the // label equaling the end of function label and an invalid "row" in the
// FDE. We need to emit a noop in this situation so that the FDE's rows are // FDE. We need to emit a noop in this situation so that the FDE's rows are
// valid. // valid.
bool RequiresNoop = LastMI && LastMI->isPrologLabel(); bool RequiresNoop = LastMI && LastMI->isCFIInstruction();
// If the function is empty and the object file uses .subsections_via_symbols, // If the function is empty and the object file uses .subsections_via_symbols,
// then we need to emit *something* to the function body to prevent the // then we need to emit *something* to the function body to prevent the

View File

@ -1610,7 +1610,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
History.push_back(MI); History.push_back(MI);
} else { } else {
// Not a DBG_VALUE instruction. // Not a DBG_VALUE instruction.
if (!MI->isLabel()) if (!MI->isPosition())
AtBlockEntry = false; AtBlockEntry = false;
// First known non-DBG_VALUE and non-frame setup location marks // First known non-DBG_VALUE and non-frame setup location marks

View File

@ -160,7 +160,7 @@ MachineBasicBlock::iterator MachineBasicBlock::getFirstNonPHI() {
MachineBasicBlock::iterator MachineBasicBlock::iterator
MachineBasicBlock::SkipPHIsAndLabels(MachineBasicBlock::iterator I) { MachineBasicBlock::SkipPHIsAndLabels(MachineBasicBlock::iterator I) {
iterator E = end(); iterator E = end();
while (I != E && (I->isPHI() || I->isLabel() || I->isDebugValue())) while (I != E && (I->isPHI() || I->isPosition() || I->isDebugValue()))
++I; ++I;
// FIXME: This needs to change if we wish to bundle labels / dbg_values // FIXME: This needs to change if we wish to bundle labels / dbg_values
// inside the bundle. // inside the bundle.

View File

@ -325,8 +325,8 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI,
} }
bool MachineCSE::isCSECandidate(MachineInstr *MI) { bool MachineCSE::isCSECandidate(MachineInstr *MI) {
if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() || if (MI->isPosition() || MI->isPHI() || MI->isImplicitDef() || MI->isKill() ||
MI->isKill() || MI->isInlineAsm() || MI->isDebugValue()) MI->isInlineAsm() || MI->isDebugValue())
return false; return false;
// Ignore copies. // Ignore copies.

View File

@ -203,6 +203,8 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
return getRegMask() == Other.getRegMask(); return getRegMask() == Other.getRegMask();
case MachineOperand::MO_MCSymbol: case MachineOperand::MO_MCSymbol:
return getMCSymbol() == Other.getMCSymbol(); return getMCSymbol() == Other.getMCSymbol();
case MachineOperand::MO_CFIIndex:
return getCFIIndex() == Other.getCFIIndex();
case MachineOperand::MO_Metadata: case MachineOperand::MO_Metadata:
return getMetadata() == Other.getMetadata(); return getMetadata() == Other.getMetadata();
} }
@ -247,6 +249,8 @@ hash_code llvm::hash_value(const MachineOperand &MO) {
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata()); return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());
case MachineOperand::MO_MCSymbol: case MachineOperand::MO_MCSymbol:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol());
case MachineOperand::MO_CFIIndex:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());
} }
llvm_unreachable("Invalid machine operand type"); llvm_unreachable("Invalid machine operand type");
} }
@ -380,6 +384,9 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {
case MachineOperand::MO_MCSymbol: case MachineOperand::MO_MCSymbol:
OS << "<MCSym=" << *getMCSymbol() << '>'; OS << "<MCSym=" << *getMCSymbol() << '>';
break; break;
case MachineOperand::MO_CFIIndex:
OS << "<call frame instruction>";
break;
} }
if (unsigned TF = getTargetFlags()) if (unsigned TF = getTargetFlags())
@ -1295,8 +1302,8 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
return false; return false;
} }
if (isLabel() || isDebugValue() || if (isPosition() || isDebugValue() || isTerminator() ||
isTerminator() || hasUnmodeledSideEffects()) hasUnmodeledSideEffects())
return false; return false;
// See if this instruction does a load. If so, we have to guarantee that the // See if this instruction does a load. If so, we have to guarantee that the

View File

@ -596,7 +596,7 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
// If there exists an instruction which belongs to the following // If there exists an instruction which belongs to the following
// categories, we will discard the load candidate. // categories, we will discard the load candidate.
if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() || if (MI->isPosition() || MI->isPHI() || MI->isImplicitDef() ||
MI->isKill() || MI->isInlineAsm() || MI->isDebugValue() || MI->isKill() || MI->isInlineAsm() || MI->isDebugValue() ||
MI->hasUnmodeledSideEffects()) { MI->hasUnmodeledSideEffects()) {
FoldAsLoadDefReg = 0; FoldAsLoadDefReg = 0;

View File

@ -804,8 +804,9 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
"RPTracker can't find MI"); "RPTracker can't find MI");
} }
assert((CanHandleTerminators || (!MI->isTerminator() && !MI->isLabel())) && assert(
"Cannot schedule terminators or labels!"); (CanHandleTerminators || (!MI->isTerminator() && !MI->isPosition())) &&
"Cannot schedule terminators or labels!");
// Add register-based dependencies (data, anti, and output). // Add register-based dependencies (data, anti, and output).
bool HasVRegDef = false; bool HasVRegDef = false;

View File

@ -645,7 +645,7 @@ bool TargetInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
const MachineBasicBlock *MBB, const MachineBasicBlock *MBB,
const MachineFunction &MF) const { const MachineFunction &MF) const {
// Terminators and labels can't be scheduled around. // Terminators and labels can't be scheduled around.
if (MI->isTerminator() || MI->isLabel()) if (MI->isTerminator() || MI->isPosition())
return true; return true;
// Don't attempt to schedule around any instruction that defines // Don't attempt to schedule around any instruction that defines

View File

@ -92,14 +92,12 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
if (NeedsFrameMoves && NumInitialBytes) { if (NeedsFrameMoves && NumInitialBytes) {
// We emit this update even if the CFA is set from a frame pointer later so // We emit this update even if the CFA is set from a frame pointer later so
// that the CFA is valid in the interim. // that the CFA is valid in the interim.
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
MachineLocation Dst(MachineLocation::VirtualFP); MachineLocation Dst(MachineLocation::VirtualFP);
unsigned Reg = MRI->getDwarfRegNum(AArch64::XSP, true); unsigned Reg = MRI->getDwarfRegNum(AArch64::XSP, true);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfa(SPLabel, Reg, -NumInitialBytes)); MCCFIInstruction::createDefCfa(nullptr, Reg, -NumInitialBytes));
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
// Otherwise we need to set the frame pointer and/or add a second stack // Otherwise we need to set the frame pointer and/or add a second stack
@ -129,12 +127,12 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
- MFI->getStackSize()); - MFI->getStackSize());
if (NeedsFrameMoves) { if (NeedsFrameMoves) {
MCSymbol *FPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(FPLabel);
unsigned Reg = MRI->getDwarfRegNum(AArch64::X29, true); unsigned Reg = MRI->getDwarfRegNum(AArch64::X29, true);
unsigned Offset = MFI->getObjectOffset(X29FrameIdx); unsigned Offset = MFI->getObjectOffset(X29FrameIdx);
MMI.addFrameInst(MCCFIInstruction::createDefCfa(FPLabel, Reg, Offset)); unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfa(nullptr, Reg, Offset));
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
FPNeedsSetting = false; FPNeedsSetting = false;
@ -155,36 +153,29 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
if (!NeedsFrameMoves) if (!NeedsFrameMoves)
return; return;
// Reuse the label if appropriate, so create it in this outer scope.
MCSymbol *CSLabel = 0;
// The rest of the stack adjustment // The rest of the stack adjustment
if (!hasFP(MF) && NumResidualBytes) { if (!hasFP(MF) && NumResidualBytes) {
CSLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(CSLabel);
MachineLocation Dst(MachineLocation::VirtualFP); MachineLocation Dst(MachineLocation::VirtualFP);
unsigned Reg = MRI->getDwarfRegNum(AArch64::XSP, true); unsigned Reg = MRI->getDwarfRegNum(AArch64::XSP, true);
unsigned Offset = NumResidualBytes + NumInitialBytes; unsigned Offset = NumResidualBytes + NumInitialBytes;
MMI.addFrameInst(MCCFIInstruction::createDefCfa(CSLabel, Reg, -Offset)); unsigned CFIIndex =
MMI.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset));
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
// And any callee-saved registers (it's fine to leave them to the end here, // And any callee-saved registers (it's fine to leave them to the end here,
// because the old values are still valid at this point. // because the old values are still valid at this point.
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
if (CSI.size()) { if (CSI.size()) {
if (!CSLabel) {
CSLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(CSLabel);
}
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
unsigned Offset = MFI->getObjectOffset(I->getFrameIdx()); unsigned Offset = MFI->getObjectOffset(I->getFrameIdx());
unsigned Reg = MRI->getDwarfRegNum(I->getReg(), true); unsigned Reg = MRI->getDwarfRegNum(I->getReg(), true);
MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, Reg, Offset)); unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(nullptr, Reg, Offset));
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
} }

View File

@ -735,7 +735,7 @@ unsigned AArch64InstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
return getInstBundleLength(MI); return getInstBundleLength(MI);
case TargetOpcode::IMPLICIT_DEF: case TargetOpcode::IMPLICIT_DEF:
case TargetOpcode::KILL: case TargetOpcode::KILL:
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
case TargetOpcode::GC_LABEL: case TargetOpcode::GC_LABEL:
case TargetOpcode::DBG_VALUE: case TargetOpcode::DBG_VALUE:

View File

@ -1543,7 +1543,7 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
return false; return false;
// Terminators and labels can't be scheduled around. // Terminators and labels can't be scheduled around.
if (MI->isTerminator() || MI->isLabel()) if (MI->isTerminator() || MI->isPosition())
return true; return true;
// Treat the start of the IT block as a scheduling boundary, but schedule // Treat the start of the IT block as a scheduling boundary, but schedule

View File

@ -866,7 +866,8 @@ void ARMCodeEmitter::emitPseudoInstruction(const MachineInstr &MI) {
} }
break; break;
} }
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
break;
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
MCE.emitLabel(MI.getOperand(0).getMCSymbol()); MCE.emitLabel(MI.getOperand(0).getMCSymbol());
break; break;

View File

@ -179,24 +179,22 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
if (ArgRegsSaveSize) { if (ArgRegsSaveSize) {
emitSPUpdate(isARM, MBB, MBBI, dl, TII, -ArgRegsSaveSize, emitSPUpdate(isARM, MBB, MBBI, dl, TII, -ArgRegsSaveSize,
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
MCSymbol *SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= ArgRegsSaveSize; CFAOffset -= ArgRegsSaveSize;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
if (!AFI->hasStackFrame()) { if (!AFI->hasStackFrame()) {
if (NumBytes - ArgRegsSaveSize != 0) { if (NumBytes - ArgRegsSaveSize != 0) {
emitSPUpdate(isARM, MBB, MBBI, dl, TII, -(NumBytes - ArgRegsSaveSize), emitSPUpdate(isARM, MBB, MBBI, dl, TII, -(NumBytes - ArgRegsSaveSize),
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
MCSymbol *SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= NumBytes - ArgRegsSaveSize; CFAOffset -= NumBytes - ArgRegsSaveSize;
MMI.addFrameInst(MCCFIInstruction::createDefCfaOffset(SPLabel, unsigned CFIIndex = MMI.addFrameInst(
CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
return; return;
} }
@ -311,12 +309,12 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
} }
if (adjustedGPRCS1Size > 0) { if (adjustedGPRCS1Size > 0) {
MCSymbol *SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, ++GPRCS1Push, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= adjustedGPRCS1Size; CFAOffset -= adjustedGPRCS1Size;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
MachineBasicBlock::iterator Pos = ++GPRCS1Push;
BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
unsigned Reg = I->getReg(); unsigned Reg = I->getReg();
@ -339,9 +337,10 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
case ARM::R6: case ARM::R6:
case ARM::R7: case ARM::R7:
case ARM::LR: case ARM::LR:
MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
MRI->getDwarfRegNum(Reg, true), nullptr, MRI->getDwarfRegNum(Reg, true), MFI->getObjectOffset(FI)));
MFI->getObjectOffset(FI))); BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
break; break;
} }
} }
@ -357,28 +356,30 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
emitRegPlusImmediate(!AFI->isThumbFunction(), MBB, GPRCS1Push, dl, TII, emitRegPlusImmediate(!AFI->isThumbFunction(), MBB, GPRCS1Push, dl, TII,
FramePtr, ARM::SP, FramePtrOffsetInPush, FramePtr, ARM::SP, FramePtrOffsetInPush,
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
MCSymbol *SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
if (FramePtrOffsetInPush) { if (FramePtrOffsetInPush) {
CFAOffset += FramePtrOffsetInPush; CFAOffset += FramePtrOffsetInPush;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfa(
MCCFIInstruction::createDefCfa(SPLabel, nullptr, MRI->getDwarfRegNum(FramePtr, true), CFAOffset));
MRI->getDwarfRegNum(FramePtr, true), CFAOffset)); BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
} else .addCFIIndex(CFIIndex);
MMI.addFrameInst(
MCCFIInstruction::createDefCfaRegister(SPLabel, } else {
MRI->getDwarfRegNum(FramePtr, true))); unsigned CFIIndex =
MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(
nullptr, MRI->getDwarfRegNum(FramePtr, true)));
BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
}
} }
if (GPRCS2Size > 0) { if (GPRCS2Size > 0) {
MCSymbol *SPLabel = Context.CreateTempSymbol(); MachineBasicBlock::iterator Pos = ++GPRCS2Push;
BuildMI(MBB, ++GPRCS2Push, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
if (!HasFP) { if (!HasFP) {
CFAOffset -= GPRCS2Size; CFAOffset -= GPRCS2Size;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
@ -393,8 +394,10 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
if (STI.isTargetMachO()) { if (STI.isTargetMachO()) {
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
unsigned Offset = MFI->getObjectOffset(FI); unsigned Offset = MFI->getObjectOffset(FI);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(SPLabel, DwarfReg, Offset)); MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset));
BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
break; break;
} }
@ -404,24 +407,17 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
if (DPRCSSize > 0) { if (DPRCSSize > 0) {
// Since vpush register list cannot have gaps, there may be multiple vpush // Since vpush register list cannot have gaps, there may be multiple vpush
// instructions in the prologue. // instructions in the prologue.
MCSymbol *SPLabel = NULL;
do { do {
MachineBasicBlock::iterator Push = DPRCSPush++; MachineBasicBlock::iterator Push = DPRCSPush++;
if (!HasFP) { if (!HasFP) {
SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= sizeOfSPAdjustment(Push);; CFAOffset -= sizeOfSPAdjustment(Push);;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} while (DPRCSPush->getOpcode() == ARM::VSTMDDB_UPD); } while (DPRCSPush->getOpcode() == ARM::VSTMDDB_UPD);
if (!SPLabel) {
SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
}
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
unsigned Reg = I->getReg(); unsigned Reg = I->getReg();
@ -430,20 +426,21 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
(Reg < ARM::D8 || Reg >= ARM::D8 + AFI->getNumAlignedDPRCS2Regs())) { (Reg < ARM::D8 || Reg >= ARM::D8 + AFI->getNumAlignedDPRCS2Regs())) {
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
unsigned Offset = MFI->getObjectOffset(FI); unsigned Offset = MFI->getObjectOffset(FI);
MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, DwarfReg, unsigned CFIIndex = MMI.addFrameInst(
Offset)); MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset));
BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
} }
if (NumBytes) { if (NumBytes) {
if (!HasFP) { if (!HasFP) {
MCSymbol *SPLabel = Context.CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= NumBytes; CFAOffset -= NumBytes;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }

View File

@ -335,7 +335,7 @@ bool MLxExpansion::ExpandFPMLxInstructions(MachineBasicBlock &MBB) {
while (MII != E) { while (MII != E) {
MachineInstr *MI = &*MII; MachineInstr *MI = &*MII;
if (MI->isLabel() || MI->isImplicitDef() || MI->isCopy()) { if (MI->isPosition() || MI->isImplicitDef() || MI->isCopy()) {
++MII; ++MII;
continue; continue;
} }

View File

@ -114,24 +114,22 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
if (ArgRegsSaveSize) { if (ArgRegsSaveSize) {
emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize, emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize,
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= ArgRegsSaveSize; CFAOffset -= ArgRegsSaveSize;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
if (!AFI->hasStackFrame()) { if (!AFI->hasStackFrame()) {
if (NumBytes - ArgRegsSaveSize != 0) { if (NumBytes - ArgRegsSaveSize != 0) {
emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -(NumBytes - ArgRegsSaveSize), emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -(NumBytes - ArgRegsSaveSize),
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= NumBytes - ArgRegsSaveSize; CFAOffset -= NumBytes - ArgRegsSaveSize;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
return; return;
} }
@ -190,12 +188,12 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
NumBytes = 0; NumBytes = 0;
} }
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)).addSym(SPLabel);
if (adjustedGPRCS1Size) { if (adjustedGPRCS1Size) {
CFAOffset -= adjustedGPRCS1Size; CFAOffset -= adjustedGPRCS1Size;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
@ -219,9 +217,10 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
case ARM::R6: case ARM::R6:
case ARM::R7: case ARM::R7:
case ARM::LR: case ARM::LR:
MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
MRI->getDwarfRegNum(Reg, true), nullptr, MRI->getDwarfRegNum(Reg, true), MFI->getObjectOffset(FI)));
MFI->getObjectOffset(FI))); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
break; break;
} }
} }
@ -234,18 +233,19 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr) AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr)
.addReg(ARM::SP).addImm(FramePtrOffsetInBlock / 4) .addReg(ARM::SP).addImm(FramePtrOffsetInBlock / 4)
.setMIFlags(MachineInstr::FrameSetup)); .setMIFlags(MachineInstr::FrameSetup));
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
if(FramePtrOffsetInBlock) { if(FramePtrOffsetInBlock) {
CFAOffset += FramePtrOffsetInBlock; CFAOffset += FramePtrOffsetInBlock;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfa(
MCCFIInstruction::createDefCfa(SPLabel, nullptr, MRI->getDwarfRegNum(FramePtr, true), CFAOffset));
MRI->getDwarfRegNum(FramePtr, true), CFAOffset)); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
} else .addCFIIndex(CFIIndex);
MMI.addFrameInst( } else {
MCCFIInstruction::createDefCfaRegister(SPLabel, unsigned CFIIndex =
MRI->getDwarfRegNum(FramePtr, true))); MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(
nullptr, MRI->getDwarfRegNum(FramePtr, true)));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
}
if (NumBytes > 508) if (NumBytes > 508)
// If offset is > 508 then sp cannot be adjusted in a single instruction, // If offset is > 508 then sp cannot be adjusted in a single instruction,
// try restoring from fp instead. // try restoring from fp instead.
@ -257,12 +257,11 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes, emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes,
MachineInstr::FrameSetup); MachineInstr::FrameSetup);
if (!HasFP) { if (!HasFP) {
MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
.addSym(SPLabel);
CFAOffset -= NumBytes; CFAOffset -= NumBytes;
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }

View File

@ -1654,7 +1654,7 @@ bool HexagonInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
return false; return false;
// Terminators and labels can't be scheduled around. // Terminators and labels can't be scheduled around.
if (MI->getDesc().isTerminator() || MI->isLabel() || MI->isInlineAsm()) if (MI->getDesc().isTerminator() || MI->isPosition() || MI->isInlineAsm())
return true; return true;
return false; return false;

View File

@ -108,7 +108,7 @@ bool VLIWResourceModel::reserveResources(SUnit *SU) {
case TargetOpcode::REG_SEQUENCE: case TargetOpcode::REG_SEQUENCE:
case TargetOpcode::IMPLICIT_DEF: case TargetOpcode::IMPLICIT_DEF:
case TargetOpcode::KILL: case TargetOpcode::KILL:
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
case TargetOpcode::COPY: case TargetOpcode::COPY:
case TargetOpcode::INLINEASM: case TargetOpcode::INLINEASM:

View File

@ -299,7 +299,7 @@ unsigned MSP430InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
default: default:
switch (Desc.getOpcode()) { switch (Desc.getOpcode()) {
default: llvm_unreachable("Unknown instruction size!"); default: llvm_unreachable("Unknown instruction size!");
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
case TargetOpcode::IMPLICIT_DEF: case TargetOpcode::IMPLICIT_DEF:
case TargetOpcode::KILL: case TargetOpcode::KILL:

View File

@ -48,20 +48,14 @@ void Mips16FrameLowering::emitPrologue(MachineFunction &MF) const {
TII.makeFrame(Mips::SP, StackSize, MBB, MBBI); TII.makeFrame(Mips::SP, StackSize, MBB, MBBI);
// emit ".cfi_def_cfa_offset StackSize" // emit ".cfi_def_cfa_offset StackSize"
MCSymbol *AdjustSPLabel = MMI.getContext().CreateTempSymbol(); unsigned CFIIndex = MMI.addFrameInst(
BuildMI(MBB, MBBI, dl, MCCFIInstruction::createDefCfaOffset(nullptr, -StackSize));
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(AdjustSPLabel); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
MMI.addFrameInst( .addCFIIndex(CFIIndex);
MCCFIInstruction::createDefCfaOffset(AdjustSPLabel, -StackSize));
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
if (CSI.size()) { if (CSI.size()) {
MCSymbol *CSLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl,
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(CSLabel);
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
@ -69,7 +63,10 @@ void Mips16FrameLowering::emitPrologue(MachineFunction &MF) const {
int64_t Offset = MFI->getObjectOffset(I->getFrameIdx()); int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
unsigned Reg = I->getReg(); unsigned Reg = I->getReg();
unsigned DReg = MRI->getDwarfRegNum(Reg, true); unsigned DReg = MRI->getDwarfRegNum(Reg, true);
MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, DReg, Offset)); unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(nullptr, DReg, Offset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
if (hasFP(MF)) if (hasFP(MF))

View File

@ -704,6 +704,6 @@ bool Filler::delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
bool Filler::terminateSearch(const MachineInstr &Candidate) const { bool Filler::terminateSearch(const MachineInstr &Candidate) const {
return (Candidate.isTerminator() || Candidate.isCall() || return (Candidate.isTerminator() || Candidate.isCall() ||
Candidate.isLabel() || Candidate.isInlineAsm() || Candidate.isPosition() || Candidate.isInlineAsm() ||
Candidate.hasUnmodeledSideEffects()); Candidate.hasUnmodeledSideEffects());
} }

View File

@ -299,11 +299,10 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
TII.adjustStackPtr(SP, -StackSize, MBB, MBBI); TII.adjustStackPtr(SP, -StackSize, MBB, MBBI);
// emit ".cfi_def_cfa_offset StackSize" // emit ".cfi_def_cfa_offset StackSize"
MCSymbol *AdjustSPLabel = MMI.getContext().CreateTempSymbol(); unsigned CFIIndex = MMI.addFrameInst(
BuildMI(MBB, MBBI, dl, MCCFIInstruction::createDefCfaOffset(nullptr, -StackSize));
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(AdjustSPLabel); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
MMI.addFrameInst( .addCFIIndex(CFIIndex);
MCCFIInstruction::createDefCfaOffset(AdjustSPLabel, -StackSize));
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
@ -315,10 +314,6 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
// Iterate over list of callee-saved registers and emit .cfi_offset // Iterate over list of callee-saved registers and emit .cfi_offset
// directives. // directives.
MCSymbol *CSLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl,
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(CSLabel);
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
E = CSI.end(); I != E; ++I) { E = CSI.end(); I != E; ++I) {
int64_t Offset = MFI->getObjectOffset(I->getFrameIdx()); int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
@ -335,14 +330,21 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
if (!STI.isLittle()) if (!STI.isLittle())
std::swap(Reg0, Reg1); std::swap(Reg0, Reg1);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(CSLabel, Reg0, Offset)); MCCFIInstruction::createOffset(nullptr, Reg0, Offset));
MMI.addFrameInst( BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
MCCFIInstruction::createOffset(CSLabel, Reg1, Offset + 4)); .addCFIIndex(CFIIndex);
CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(nullptr, Reg1, Offset + 4));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} else { } else {
// Reg is either in GPR32 or FGR32. // Reg is either in GPR32 or FGR32.
MMI.addFrameInst(MCCFIInstruction::createOffset( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
CSLabel, MRI->getDwarfRegNum(Reg, 1), Offset)); nullptr, MRI->getDwarfRegNum(Reg, 1), Offset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
} }
@ -360,13 +362,13 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
} }
// Emit .cfi_offset directives for eh data registers. // Emit .cfi_offset directives for eh data registers.
MCSymbol *CSLabel2 = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl,
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(CSLabel2);
for (int I = 0; I < 4; ++I) { for (int I = 0; I < 4; ++I) {
int64_t Offset = MFI->getObjectOffset(MipsFI->getEhDataRegFI(I)); int64_t Offset = MFI->getObjectOffset(MipsFI->getEhDataRegFI(I));
unsigned Reg = MRI->getDwarfRegNum(ehDataReg(I), true); unsigned Reg = MRI->getDwarfRegNum(ehDataReg(I), true);
MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel2, Reg, Offset)); unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(nullptr, Reg, Offset));
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
@ -376,11 +378,10 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF) const {
BuildMI(MBB, MBBI, dl, TII.get(ADDu), FP).addReg(SP).addReg(ZERO); BuildMI(MBB, MBBI, dl, TII.get(ADDu), FP).addReg(SP).addReg(ZERO);
// emit ".cfi_def_cfa_register $fp" // emit ".cfi_def_cfa_register $fp"
MCSymbol *SetFPLabel = MMI.getContext().CreateTempSymbol(); unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(
BuildMI(MBB, MBBI, dl, nullptr, MRI->getDwarfRegNum(FP, true)));
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(SetFPLabel); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister( .addCFIIndex(CFIIndex);
SetFPLabel, MRI->getDwarfRegNum(FP, true)));
} }
} }

View File

@ -121,7 +121,8 @@ void PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
default: default:
MCE.emitWordBE(getBinaryCodeForInstr(MI)); MCE.emitWordBE(getBinaryCodeForInstr(MI));
break; break;
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
break;
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
MCE.emitLabel(MI.getOperand(0).getMCSymbol()); MCE.emitLabel(MI.getOperand(0).getMCSymbol());
break; break;

View File

@ -353,9 +353,6 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
assert((isDarwinABI || isSVR4ABI) && assert((isDarwinABI || isSVR4ABI) &&
"Currently only Darwin and SVR4 ABIs are supported for PowerPC."); "Currently only Darwin and SVR4 ABIs are supported for PowerPC.");
// Prepare for frame info.
MCSymbol *FrameLabel = 0;
// Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it, // Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it,
// process it. // process it.
if (!isSVR4ABI) if (!isSVR4ABI)
@ -561,36 +558,37 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
// Add the "machine moves" for the instructions we generated above, but in // Add the "machine moves" for the instructions we generated above, but in
// reverse order. // reverse order.
if (needsFrameMoves) { if (needsFrameMoves) {
// Mark effective beginning of when frame pointer becomes valid.
FrameLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(PPC::PROLOG_LABEL)).addSym(FrameLabel);
// Show update of SP. // Show update of SP.
assert(NegFrameSize); assert(NegFrameSize);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(FrameLabel, NegFrameSize)); MCCFIInstruction::createDefCfaOffset(nullptr, NegFrameSize));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
if (HasFP) { if (HasFP) {
unsigned Reg = MRI->getDwarfRegNum(FPReg, true); unsigned Reg = MRI->getDwarfRegNum(FPReg, true);
MMI.addFrameInst( CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(FrameLabel, Reg, FPOffset)); MCCFIInstruction::createOffset(nullptr, Reg, FPOffset));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
if (HasBP) { if (HasBP) {
unsigned Reg = MRI->getDwarfRegNum(BPReg, true); unsigned Reg = MRI->getDwarfRegNum(BPReg, true);
MMI.addFrameInst( CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(FrameLabel, Reg, BPOffset)); MCCFIInstruction::createOffset(nullptr, Reg, BPOffset));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
if (MustSaveLR) { if (MustSaveLR) {
unsigned Reg = MRI->getDwarfRegNum(LRReg, true); unsigned Reg = MRI->getDwarfRegNum(LRReg, true);
MMI.addFrameInst( CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(FrameLabel, Reg, LROffset)); MCCFIInstruction::createOffset(nullptr, Reg, LROffset));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
MCSymbol *ReadyLabel = 0;
// If there is a frame pointer, copy R1 into R31 // If there is a frame pointer, copy R1 into R31
if (HasFP) { if (HasFP) {
BuildMI(MBB, MBBI, dl, OrInst, FPReg) BuildMI(MBB, MBBI, dl, OrInst, FPReg)
@ -598,19 +596,17 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
.addReg(SPReg); .addReg(SPReg);
if (needsFrameMoves) { if (needsFrameMoves) {
ReadyLabel = MMI.getContext().CreateTempSymbol();
// Mark effective beginning of when frame pointer is ready. // Mark effective beginning of when frame pointer is ready.
BuildMI(MBB, MBBI, dl, TII.get(PPC::PROLOG_LABEL)).addSym(ReadyLabel);
unsigned Reg = MRI->getDwarfRegNum(FPReg, true); unsigned Reg = MRI->getDwarfRegNum(FPReg, true);
MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(ReadyLabel, Reg)); unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
if (needsFrameMoves) { if (needsFrameMoves) {
MCSymbol *Label = HasFP ? ReadyLabel : FrameLabel;
// Add callee saved registers to move list. // Add callee saved registers to move list.
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
for (unsigned I = 0, E = CSI.size(); I != E; ++I) { for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
@ -631,14 +627,18 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
// For 64-bit SVR4 when we have spilled CRs, the spill location // For 64-bit SVR4 when we have spilled CRs, the spill location
// is SP+8, not a frame-relative slot. // is SP+8, not a frame-relative slot.
if (isSVR4ABI && isPPC64 && (PPC::CR2 <= Reg && Reg <= PPC::CR4)) { if (isSVR4ABI && isPPC64 && (PPC::CR2 <= Reg && Reg <= PPC::CR4)) {
MMI.addFrameInst(MCCFIInstruction::createOffset( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
Label, MRI->getDwarfRegNum(PPC::CR2, true), 8)); nullptr, MRI->getDwarfRegNum(PPC::CR2, true), 8));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
continue; continue;
} }
int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx()); int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
MMI.addFrameInst(MCCFIInstruction::createOffset( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
Label, MRI->getDwarfRegNum(Reg, true), Offset)); nullptr, MRI->getDwarfRegNum(Reg, true), Offset));
BuildMI(MBB, MBBI, dl, TII.get(PPC::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
} }

View File

@ -211,12 +211,8 @@ Filler::findDelayInstr(MachineBasicBlock &MBB,
if (I->isDebugValue()) if (I->isDebugValue())
continue; continue;
if (I->hasUnmodeledSideEffects() || I->isInlineAsm() || I->isPosition() ||
if (I->hasUnmodeledSideEffects() I->hasDelaySlot() || I->isBundledWithSucc())
|| I->isInlineAsm()
|| I->isLabel()
|| I->hasDelaySlot()
|| I->isBundledWithSucc())
break; break;
if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) { if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) {

View File

@ -145,7 +145,8 @@ void SparcCodeEmitter::emitInstruction(MachineBasicBlock::instr_iterator MI,
} }
break; break;
} }
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
break;
case TargetOpcode::EH_LABEL: { case TargetOpcode::EH_LABEL: {
MCE.emitLabel(MI->getOperand(0).getMCSymbol()); MCE.emitLabel(MI->getOperand(0).getMCSymbol());
break; break;

View File

@ -104,23 +104,23 @@ void SparcFrameLowering::emitPrologue(MachineFunction &MF) const {
MachineModuleInfo &MMI = MF.getMMI(); MachineModuleInfo &MMI = MF.getMMI();
const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo(); const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl, TII.get(SP::PROLOG_LABEL)).addSym(FrameLabel);
unsigned regFP = MRI->getDwarfRegNum(SP::I6, true); unsigned regFP = MRI->getDwarfRegNum(SP::I6, true);
// Emit ".cfi_def_cfa_register 30". // Emit ".cfi_def_cfa_register 30".
MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(FrameLabel, unsigned CFIIndex =
regFP)); MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, regFP));
BuildMI(MBB, MBBI, dl, TII.get(SP::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
// Emit ".cfi_window_save". // Emit ".cfi_window_save".
MMI.addFrameInst(MCCFIInstruction::createWindowSave(FrameLabel)); CFIIndex = MMI.addFrameInst(MCCFIInstruction::createWindowSave(nullptr));
BuildMI(MBB, MBBI, dl, TII.get(SP::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
unsigned regInRA = MRI->getDwarfRegNum(SP::I7, true); unsigned regInRA = MRI->getDwarfRegNum(SP::I7, true);
unsigned regOutRA = MRI->getDwarfRegNum(SP::O7, true); unsigned regOutRA = MRI->getDwarfRegNum(SP::O7, true);
// Emit ".cfi_register 15, 31". // Emit ".cfi_register 15, 31".
MMI.addFrameInst(MCCFIInstruction::createRegister(FrameLabel, CFIIndex = MMI.addFrameInst(
regOutRA, MCCFIInstruction::createRegister(nullptr, regOutRA, regInRA));
regInRA)); BuildMI(MBB, MBBI, dl, TII.get(SP::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
} }
void SparcFrameLowering:: void SparcFrameLowering::

View File

@ -333,15 +333,14 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF) const {
llvm_unreachable("Couldn't skip over GPR saves"); llvm_unreachable("Couldn't skip over GPR saves");
// Add CFI for the GPR saves. // Add CFI for the GPR saves.
MCSymbol *GPRSaveLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL,
ZII->get(TargetOpcode::PROLOG_LABEL)).addSym(GPRSaveLabel);
for (auto &Save : CSI) { for (auto &Save : CSI) {
unsigned Reg = Save.getReg(); unsigned Reg = Save.getReg();
if (SystemZ::GR64BitRegClass.contains(Reg)) { if (SystemZ::GR64BitRegClass.contains(Reg)) {
int64_t Offset = SPOffsetFromCFA + RegSpillOffsets[Reg]; int64_t Offset = SPOffsetFromCFA + RegSpillOffsets[Reg];
MMI.addFrameInst(MCCFIInstruction::createOffset( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
GPRSaveLabel, MRI->getDwarfRegNum(Reg, true), Offset)); nullptr, MRI->getDwarfRegNum(Reg, true), Offset));
BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
} }
} }
@ -353,11 +352,10 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF) const {
emitIncrement(MBB, MBBI, DL, SystemZ::R15D, Delta, ZII); emitIncrement(MBB, MBBI, DL, SystemZ::R15D, Delta, ZII);
// Add CFI for the allocation. // Add CFI for the allocation.
MCSymbol *AdjustSPLabel = MMI.getContext().CreateTempSymbol(); unsigned CFIIndex = MMI.addFrameInst(
BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::PROLOG_LABEL)) MCCFIInstruction::createDefCfaOffset(nullptr, SPOffsetFromCFA + Delta));
.addSym(AdjustSPLabel); BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::CFI_INSTRUCTION))
MMI.addFrameInst(MCCFIInstruction::createDefCfaOffset( .addCFIIndex(CFIIndex);
AdjustSPLabel, SPOffsetFromCFA + Delta));
SPOffsetFromCFA += Delta; SPOffsetFromCFA += Delta;
} }
@ -367,12 +365,11 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF) const {
.addReg(SystemZ::R15D); .addReg(SystemZ::R15D);
// Add CFI for the new frame location. // Add CFI for the new frame location.
MCSymbol *SetFPLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::PROLOG_LABEL))
.addSym(SetFPLabel);
unsigned HardFP = MRI->getDwarfRegNum(SystemZ::R11D, true); unsigned HardFP = MRI->getDwarfRegNum(SystemZ::R11D, true);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaRegister(SetFPLabel, HardFP)); MCCFIInstruction::createDefCfaRegister(nullptr, HardFP));
BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
// Mark the FramePtr as live at the beginning of every block except // Mark the FramePtr as live at the beginning of every block except
// the entry block. (We'll have marked R11 as live on entry when // the entry block. (We'll have marked R11 as live on entry when
@ -382,7 +379,7 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF) const {
} }
// Skip over the FPR saves. // Skip over the FPR saves.
MCSymbol *FPRSaveLabel = 0; SmallVector<unsigned, 8> CFIIndexes;
for (auto &Save : CSI) { for (auto &Save : CSI) {
unsigned Reg = Save.getReg(); unsigned Reg = Save.getReg();
if (SystemZ::FP64BitRegClass.contains(Reg)) { if (SystemZ::FP64BitRegClass.contains(Reg)) {
@ -394,19 +391,19 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF) const {
llvm_unreachable("Couldn't skip over FPR save"); llvm_unreachable("Couldn't skip over FPR save");
// Add CFI for the this save. // Add CFI for the this save.
if (!FPRSaveLabel)
FPRSaveLabel = MMI.getContext().CreateTempSymbol();
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
int64_t Offset = getFrameIndexOffset(MF, Save.getFrameIdx()); int64_t Offset = getFrameIndexOffset(MF, Save.getFrameIdx());
MMI.addFrameInst(MCCFIInstruction::createOffset( unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
FPRSaveLabel, DwarfReg, SPOffsetFromCFA + Offset)); nullptr, DwarfReg, SPOffsetFromCFA + Offset));
CFIIndexes.push_back(CFIIndex);
} }
} }
// Complete the CFI for the FPR saves, modelling them as taking effect // Complete the CFI for the FPR saves, modelling them as taking effect
// after the last save. // after the last save.
if (FPRSaveLabel) for (auto CFIIndex : CFIIndexes) {
BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::PROLOG_LABEL)) BuildMI(MBB, MBBI, DL, ZII->get(TargetOpcode::CFI_INSTRUCTION))
.addSym(FPRSaveLabel); .addCFIIndex(CFIIndex);
}
} }
void SystemZFrameLowering::emitEpilogue(MachineFunction &MF, void SystemZFrameLowering::emitEpilogue(MachineFunction &MF,

View File

@ -1115,7 +1115,8 @@ void Emitter<CodeEmitter>::emitInstruction(MachineInstr &MI,
if (MI.getOperand(0).getSymbolName()[0]) if (MI.getOperand(0).getSymbolName()[0])
report_fatal_error("JIT does not support inline asm!"); report_fatal_error("JIT does not support inline asm!");
break; break;
case TargetOpcode::PROLOG_LABEL: case TargetOpcode::CFI_INSTRUCTION:
break;
case TargetOpcode::GC_LABEL: case TargetOpcode::GC_LABEL:
case TargetOpcode::EH_LABEL: case TargetOpcode::EH_LABEL:
MCE.emitLabel(MI.getOperand(0).getMCSymbol()); MCE.emitLabel(MI.getOperand(0).getMCSymbol());

View File

@ -304,12 +304,14 @@ static bool isEAXLiveIn(MachineFunction &MF) {
return false; return false;
} }
void X86FrameLowering::emitCalleeSavedFrameMoves(MachineFunction &MF, void X86FrameLowering::emitCalleeSavedFrameMoves(
MCSymbol *Label, MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, DebugLoc DL,
unsigned FramePtr) const { unsigned FramePtr) const {
MachineFunction &MF = *MBB.getParent();
MachineFrameInfo *MFI = MF.getFrameInfo(); MachineFrameInfo *MFI = MF.getFrameInfo();
MachineModuleInfo &MMI = MF.getMMI(); MachineModuleInfo &MMI = MF.getMMI();
const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo(); const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
const X86InstrInfo &TII = *TM.getInstrInfo();
// Add callee saved registers to move list. // Add callee saved registers to move list.
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
@ -363,7 +365,9 @@ void X86FrameLowering::emitCalleeSavedFrameMoves(MachineFunction &MF,
continue; continue;
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
MMI.addFrameInst(MCCFIInstruction::createOffset(Label, DwarfReg, Offset)); unsigned CFIIndex =
MMI.addFrameInst(MCCFIInstruction::createOffset(0, DwarfReg, Offset));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
} }
} }
@ -503,19 +507,19 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
if (needsFrameMoves) { if (needsFrameMoves) {
// Mark the place where EBP/RBP was saved. // Mark the place where EBP/RBP was saved.
MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL))
.addSym(FrameLabel);
// Define the current CFA rule to use the provided offset. // Define the current CFA rule to use the provided offset.
assert(StackSize); assert(StackSize);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(FrameLabel, 2 * stackGrowth)); MCCFIInstruction::createDefCfaOffset(0, 2 * stackGrowth));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
// Change the rule for the FramePtr to be an "offset" rule. // Change the rule for the FramePtr to be an "offset" rule.
unsigned DwarfFramePtr = RegInfo->getDwarfRegNum(FramePtr, true); unsigned DwarfFramePtr = RegInfo->getDwarfRegNum(FramePtr, true);
MMI.addFrameInst(MCCFIInstruction::createOffset(FrameLabel, DwarfFramePtr, CFIIndex = MMI.addFrameInst(
2 * stackGrowth)); MCCFIInstruction::createOffset(0, DwarfFramePtr, 2 * stackGrowth));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
// Update EBP with the new base value. // Update EBP with the new base value.
@ -526,14 +530,12 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
if (needsFrameMoves) { if (needsFrameMoves) {
// Mark effective beginning of when frame pointer becomes valid. // Mark effective beginning of when frame pointer becomes valid.
MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL))
.addSym(FrameLabel);
// Define the current CFA to use the EBP/RBP register. // Define the current CFA to use the EBP/RBP register.
unsigned DwarfFramePtr = RegInfo->getDwarfRegNum(FramePtr, true); unsigned DwarfFramePtr = RegInfo->getDwarfRegNum(FramePtr, true);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaRegister(FrameLabel, DwarfFramePtr)); MCCFIInstruction::createDefCfaRegister(0, DwarfFramePtr));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
// Mark the FramePtr as live-in in every block except the entry. // Mark the FramePtr as live-in in every block except the entry.
@ -557,13 +559,12 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
if (!HasFP && needsFrameMoves) { if (!HasFP && needsFrameMoves) {
// Mark callee-saved push instruction. // Mark callee-saved push instruction.
MCSymbol *Label = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL)).addSym(Label);
// Define the current CFA rule to use the provided offset. // Define the current CFA rule to use the provided offset.
assert(StackSize); assert(StackSize);
MMI.addFrameInst( unsigned CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createDefCfaOffset(Label, StackOffset)); MCCFIInstruction::createDefCfaOffset(nullptr, StackOffset));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
StackOffset += stackGrowth; StackOffset += stackGrowth;
} }
} }
@ -692,20 +693,19 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
if (( (!HasFP && NumBytes) || PushedRegs) && needsFrameMoves) { if (( (!HasFP && NumBytes) || PushedRegs) && needsFrameMoves) {
// Mark end of stack pointer adjustment. // Mark end of stack pointer adjustment.
MCSymbol *Label = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL))
.addSym(Label);
if (!HasFP && NumBytes) { if (!HasFP && NumBytes) {
// Define the current CFA rule to use the provided offset. // Define the current CFA rule to use the provided offset.
assert(StackSize); assert(StackSize);
MMI.addFrameInst(MCCFIInstruction::createDefCfaOffset( unsigned CFIIndex = MMI.addFrameInst(
Label, -StackSize + stackGrowth)); MCCFIInstruction::createDefCfaOffset(0, -StackSize + stackGrowth));
BuildMI(MBB, MBBI, DL, TII.get(X86::CFI_INSTRUCTION))
.addCFIIndex(CFIIndex);
} }
// Emit DWARF info specifying the offsets of the callee-saved registers. // Emit DWARF info specifying the offsets of the callee-saved registers.
if (PushedRegs) if (PushedRegs)
emitCalleeSavedFrameMoves(MF, Label, HasFP ? FramePtr : StackPtr); emitCalleeSavedFrameMoves(MBB, MBBI, DL, HasFP ? FramePtr : StackPtr);
} }
} }

View File

@ -34,7 +34,8 @@ public:
TM(tm), STI(sti) { TM(tm), STI(sti) {
} }
void emitCalleeSavedFrameMoves(MachineFunction &MF, MCSymbol *Label, void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI, DebugLoc DL,
unsigned FramePtr) const; unsigned FramePtr) const;
/// emitProlog/emitEpilog - These methods insert prolog and epilog code into /// emitProlog/emitEpilog - These methods insert prolog and epilog code into

View File

@ -62,29 +62,27 @@ static void EmitDefCfaRegister(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI, DebugLoc dl, MachineBasicBlock::iterator MBBI, DebugLoc dl,
const TargetInstrInfo &TII, const TargetInstrInfo &TII,
MachineModuleInfo *MMI, unsigned DRegNum) { MachineModuleInfo *MMI, unsigned DRegNum) {
MCSymbol *Label = MMI->getContext().CreateTempSymbol(); unsigned CFIIndex = MMI->addFrameInst(
BuildMI(MBB, MBBI, dl, TII.get(XCore::PROLOG_LABEL)).addSym(Label); MCCFIInstruction::createDefCfaRegister(nullptr, DRegNum));
MMI->addFrameInst(MCCFIInstruction::createDefCfaRegister(Label, DRegNum)); BuildMI(MBB, MBBI, dl, TII.get(XCore::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
} }
static void EmitDefCfaOffset(MachineBasicBlock &MBB, static void EmitDefCfaOffset(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI, DebugLoc dl, MachineBasicBlock::iterator MBBI, DebugLoc dl,
const TargetInstrInfo &TII, const TargetInstrInfo &TII,
MachineModuleInfo *MMI, int Offset) { MachineModuleInfo *MMI, int Offset) {
MCSymbol *Label = MMI->getContext().CreateTempSymbol(); unsigned CFIIndex =
BuildMI(MBB, MBBI, dl, TII.get(XCore::PROLOG_LABEL)).addSym(Label); MMI->addFrameInst(MCCFIInstruction::createDefCfaOffset(nullptr, -Offset));
MMI->addFrameInst(MCCFIInstruction::createDefCfaOffset(Label, -Offset)); BuildMI(MBB, MBBI, dl, TII.get(XCore::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
} }
static void EmitCfiOffset(MachineBasicBlock &MBB, static void EmitCfiOffset(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI, DebugLoc dl, MachineBasicBlock::iterator MBBI, DebugLoc dl,
const TargetInstrInfo &TII, MachineModuleInfo *MMI, const TargetInstrInfo &TII, MachineModuleInfo *MMI,
unsigned DRegNum, int Offset, MCSymbol *Label) { unsigned DRegNum, int Offset) {
if (!Label) { unsigned CFIIndex = MMI->addFrameInst(
Label = MMI->getContext().CreateTempSymbol(); MCCFIInstruction::createOffset(nullptr, DRegNum, Offset));
BuildMI(MBB, MBBI, dl, TII.get(XCore::PROLOG_LABEL)).addSym(Label); BuildMI(MBB, MBBI, dl, TII.get(XCore::CFI_INSTRUCTION)).addCFIIndex(CFIIndex);
}
MMI->addFrameInst(MCCFIInstruction::createOffset(Label, DRegNum, Offset));
} }
/// The SP register is moved in steps of 'MaxImmU16' towards the bottom of the /// The SP register is moved in steps of 'MaxImmU16' towards the bottom of the
@ -262,7 +260,7 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF) const {
if (emitFrameMoves) { if (emitFrameMoves) {
EmitDefCfaOffset(MBB, MBBI, dl, TII, MMI, Adjusted*4); EmitDefCfaOffset(MBB, MBBI, dl, TII, MMI, Adjusted*4);
unsigned DRegNum = MRI->getDwarfRegNum(XCore::LR, true); unsigned DRegNum = MRI->getDwarfRegNum(XCore::LR, true);
EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, 0, NULL); EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, 0);
} }
} }
@ -287,7 +285,7 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF) const {
MachineMemOperand::MOStore)); MachineMemOperand::MOStore));
if (emitFrameMoves) { if (emitFrameMoves) {
unsigned DRegNum = MRI->getDwarfRegNum(SpillList[i].Reg, true); unsigned DRegNum = MRI->getDwarfRegNum(SpillList[i].Reg, true);
EmitCfiOffset(MBB,MBBI,dl,TII,MMI, DRegNum, SpillList[i].Offset, NULL); EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, SpillList[i].Offset);
} }
} }
@ -306,14 +304,14 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF) const {
if (emitFrameMoves) { if (emitFrameMoves) {
// Frame moves for callee saved. // Frame moves for callee saved.
std::vector<std::pair<MCSymbol*, CalleeSavedInfo> >&SpillLabels = auto SpillLabels = XFI->getSpillLabels();
XFI->getSpillLabels();
for (unsigned I = 0, E = SpillLabels.size(); I != E; ++I) { for (unsigned I = 0, E = SpillLabels.size(); I != E; ++I) {
MCSymbol *SpillLabel = SpillLabels[I].first; MachineBasicBlock::iterator Pos = SpillLabels[I].first;
++Pos;
CalleeSavedInfo &CSI = SpillLabels[I].second; CalleeSavedInfo &CSI = SpillLabels[I].second;
int Offset = MFI->getObjectOffset(CSI.getFrameIdx()); int Offset = MFI->getObjectOffset(CSI.getFrameIdx());
unsigned DRegNum = MRI->getDwarfRegNum(CSI.getReg(), true); unsigned DRegNum = MRI->getDwarfRegNum(CSI.getReg(), true);
EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, Offset, SpillLabel); EmitCfiOffset(MBB, Pos, dl, TII, MMI, DRegNum, Offset);
} }
if (XFI->hasEHSpillSlot()) { if (XFI->hasEHSpillSlot()) {
// The unwinder requires stack slot & CFI offsets for the exception info. // The unwinder requires stack slot & CFI offsets for the exception info.
@ -323,10 +321,10 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF) const {
assert(SpillList.size()==2 && "Unexpected SpillList size"); assert(SpillList.size()==2 && "Unexpected SpillList size");
EmitCfiOffset(MBB, MBBI, dl, TII, MMI, EmitCfiOffset(MBB, MBBI, dl, TII, MMI,
MRI->getDwarfRegNum(SpillList[0].Reg, true), MRI->getDwarfRegNum(SpillList[0].Reg, true),
SpillList[0].Offset, NULL); SpillList[0].Offset);
EmitCfiOffset(MBB, MBBI, dl, TII, MMI, EmitCfiOffset(MBB, MBBI, dl, TII, MMI,
MRI->getDwarfRegNum(SpillList[1].Reg, true), MRI->getDwarfRegNum(SpillList[1].Reg, true),
SpillList[1].Offset, NULL); SpillList[1].Offset);
} }
} }
} }
@ -427,9 +425,9 @@ spillCalleeSavedRegisters(MachineBasicBlock &MBB,
const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
TII.storeRegToStackSlot(MBB, MI, Reg, true, it->getFrameIdx(), RC, TRI); TII.storeRegToStackSlot(MBB, MI, Reg, true, it->getFrameIdx(), RC, TRI);
if (emitFrameMoves) { if (emitFrameMoves) {
MCSymbol *SaveLabel = MF->getContext().CreateTempSymbol(); auto Store = MI;
BuildMI(MBB, MI, DL, TII.get(XCore::PROLOG_LABEL)).addSym(SaveLabel); --Store;
XFI->getSpillLabels().push_back(std::make_pair(SaveLabel, *it)); XFI->getSpillLabels().push_back(std::make_pair(Store, *it));
} }
} }
return true; return true;

View File

@ -37,7 +37,8 @@ class XCoreFunctionInfo : public MachineFunctionInfo {
bool ReturnStackOffsetSet; bool ReturnStackOffsetSet;
int VarArgsFrameIndex; int VarArgsFrameIndex;
mutable int CachedEStackSize; mutable int CachedEStackSize;
std::vector<std::pair<MCSymbol*, CalleeSavedInfo> > SpillLabels; std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>>
SpillLabels;
public: public:
XCoreFunctionInfo() : XCoreFunctionInfo() :
@ -95,7 +96,8 @@ public:
bool isLargeFrame(const MachineFunction &MF) const; bool isLargeFrame(const MachineFunction &MF) const;
std::vector<std::pair<MCSymbol*, CalleeSavedInfo> > &getSpillLabels() { std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>> &
getSpillLabels() {
return SpillLabels; return SpillLabels;
} }
}; };

View File

@ -10,8 +10,8 @@
; ... referring indirectly to stubs for its typeinfo ... ; ... referring indirectly to stubs for its typeinfo ...
; CHECK: // @TType Encoding = indirect pcrel sdata8 ; CHECK: // @TType Encoding = indirect pcrel sdata8
; ... one of which is "int"'s typeinfo ; ... one of which is "int"'s typeinfo
; CHECK: .Ltmp9: ; CHECK: .Ltmp7:
; CHECK-NEXT: .xword .L_ZTIi.DW.stub-.Ltmp9 ; CHECK-NEXT: .xword .L_ZTIi.DW.stub-.Ltmp7
; .. and which is properly defined (in a writable section for the dynamic loader) later. ; .. and which is properly defined (in a writable section for the dynamic loader) later.
; CHECK: .section .data.rel,"aw" ; CHECK: .section .data.rel,"aw"

View File

@ -9,7 +9,7 @@
; statement shouldn't be implicitly defined. ; statement shouldn't be implicitly defined.
; CHECK-LABEL: func: ; CHECK-LABEL: func:
; CHECK: Ltmp3: @ Block address taken ; CHECK: Ltmp1: @ Block address taken
; CHECK-NOT: @ implicit-def: R0 ; CHECK-NOT: @ implicit-def: R0
; CHECK: @ 4-byte Reload ; CHECK: @ 4-byte Reload

View File

@ -69,7 +69,7 @@ L1: ; preds = %L2, %bb2
store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4 store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
ret i32 %res.3 ret i32 %res.3
} }
; ARM: .long Ltmp1-(LPC{{.*}}+8) ; ARM: .long Ltmp0-(LPC{{.*}}+8)
; THUMB: .long Ltmp1-(LPC{{.*}}+4) ; THUMB: .long Ltmp0-(LPC{{.*}}+4)
; THUMB: .long _nextaddr-([[NEXTADDR_PCBASE]]+4) ; THUMB: .long _nextaddr-([[NEXTADDR_PCBASE]]+4)
; THUMB2: .long Ltmp1 ; THUMB2: .long Ltmp0

View File

@ -18,7 +18,7 @@ define void @bar() {
; CHECK-NEXT: Ltmp0: ; CHECK-NEXT: Ltmp0:
; CHECK: _bar: ## @bar ; CHECK: _bar: ## @bar
; CHECK-NEXT: Ltmp3: ; CHECK-NEXT: Ltmp2:
; CHECK: ## FDE CIE Offset ; CHECK: ## FDE CIE Offset
; CHECK-NEXT: .long ; CHECK-NEXT: .long
@ -30,7 +30,7 @@ define void @bar() {
; CHECK: ## FDE CIE Offset ; CHECK: ## FDE CIE Offset
; CHECK-NEXT: .long ; CHECK-NEXT: .long
; CHECK-NEXT: Ltmp[[NUM1:[0-9]*]]: ; CHECK-NEXT: Ltmp[[NUM1:[0-9]*]]:
; CHECK-NEXT: Ltmp[[NUM2:[0-9]*]] = Ltmp3-Ltmp[[NUM1]] ## FDE initial location ; CHECK-NEXT: Ltmp[[NUM2:[0-9]*]] = Ltmp2-Ltmp[[NUM1]] ## FDE initial location
; CHECK-NEXT: {{.quad|.long}} Ltmp[[NUM2]] ; CHECK-NEXT: {{.quad|.long}} Ltmp[[NUM2]]
@ -38,7 +38,7 @@ define void @bar() {
; OLD-NEXT: Ltmp0: ; OLD-NEXT: Ltmp0:
; OLD: _bar: ## @bar ; OLD: _bar: ## @bar
; OLD-NEXT: Ltmp3: ; OLD-NEXT: Ltmp2:
; OLD: ## FDE CIE Offset ; OLD: ## FDE CIE Offset
; OLD-NEXT: .long ; OLD-NEXT: .long
@ -48,4 +48,4 @@ define void @bar() {
; OLD: ## FDE CIE Offset ; OLD: ## FDE CIE Offset
; OLD-NEXT: .long ; OLD-NEXT: .long
; OLD-NEXT: Ltmp[[NUM1:[0-9]*]]: ; OLD-NEXT: Ltmp[[NUM1:[0-9]*]]:
; OLD-NEXT: {{.quad|.long}} Ltmp3-Ltmp[[NUM1]] ## FDE initial location ; OLD-NEXT: {{.quad|.long}} Ltmp2-Ltmp[[NUM1]] ## FDE initial location

View File

@ -152,7 +152,8 @@ FindUniqueOperandCommands(std::vector<std::string> &UniqueOperandCommands,
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) { for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
const AsmWriterInst *Inst = getAsmWriterInstByID(i); const AsmWriterInst *Inst = getAsmWriterInstByID(i);
if (Inst == 0) continue; // PHI, INLINEASM, PROLOG_LABEL, etc. if (Inst == 0)
continue; // PHI, INLINEASM, CFI_INSTRUCTION, etc.
std::string Command; std::string Command;
if (Inst->Operands.empty()) if (Inst->Operands.empty())

View File

@ -294,7 +294,7 @@ GetInstByName(const char *Name,
void CodeGenTarget::ComputeInstrsByEnum() const { void CodeGenTarget::ComputeInstrsByEnum() const {
// The ordering here must match the ordering in TargetOpcodes.h. // The ordering here must match the ordering in TargetOpcodes.h.
static const char *const FixedInstrs[] = { static const char *const FixedInstrs[] = {
"PHI", "INLINEASM", "PROLOG_LABEL", "EH_LABEL", "PHI", "INLINEASM", "CFI_INSTRUCTION", "EH_LABEL",
"GC_LABEL", "KILL", "EXTRACT_SUBREG", "INSERT_SUBREG", "GC_LABEL", "KILL", "EXTRACT_SUBREG", "INSERT_SUBREG",
"IMPLICIT_DEF", "SUBREG_TO_REG", "COPY_TO_REGCLASS", "DBG_VALUE", "IMPLICIT_DEF", "SUBREG_TO_REG", "COPY_TO_REGCLASS", "DBG_VALUE",
"REG_SEQUENCE", "COPY", "BUNDLE", "LIFETIME_START", "REG_SEQUENCE", "COPY", "BUNDLE", "LIFETIME_START",