Index: include/llvm/MC/MCParser/MCTargetAsmParser.h =================================================================== --- include/llvm/MC/MCParser/MCTargetAsmParser.h +++ include/llvm/MC/MCParser/MCTargetAsmParser.h @@ -476,6 +476,9 @@ return nullptr; } + // For actions that have to be performed before a label is emitted + virtual void doBeforeLabelEmit(MCSymbol *Symbol) {} + virtual void onLabelParsed(MCSymbol *Symbol) {} /// Ensure that all previously parsed instructions have been emitted to the Index: lib/MC/MCParser/AsmParser.cpp =================================================================== --- lib/MC/MCParser/AsmParser.cpp +++ lib/MC/MCParser/AsmParser.cpp @@ -1808,6 +1808,8 @@ Lex(); } + getTargetParser().doBeforeLabelEmit(Sym); + // Emit the label. if (!getTargetParser().isParsingInlineAsm()) Out.EmitLabel(Sym, IDLoc); Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -631,6 +631,8 @@ void ReportNearMisses(SmallVectorImpl &NearMisses, SMLoc IDLoc, OperandVector &Operands); + void doBeforeLabelEmit(MCSymbol *Symbol) override; + void onLabelParsed(MCSymbol *Symbol) override; }; @@ -9443,10 +9445,13 @@ return false; } -void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) { +void ARMAsmParser::doBeforeLabelEmit(MCSymbol *Symbol) { // We need to flush the current implicit IT block on a label, because it is // not legal to branch into an IT block. flushPendingInstructions(getStreamer()); +} + +void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) { if (NextSymbolIsThumb) { getParser().getStreamer().EmitThumbFunc(Symbol); NextSymbolIsThumb = false; Index: test/MC/ARM/implicit-it-generation.s =================================================================== --- test/MC/ARM/implicit-it-generation.s +++ test/MC/ARM/implicit-it-generation.s @@ -73,12 +73,14 @@ addeq r0, #1 label: addeq r0, #1 -5: +five: addeq r0, #1 @ CHECK: it eq @ CHECK: addeq +@ CHECK: label @ CHECK: it eq @ CHECK: addeq +@ CHECK: five @ CHECK: it eq @ CHECK: addeq