We currently use a callback to handle an IL pass deleting a BB that still
has a reference to it. Unfortunately, that doesn't work for codegen passes since we don't get notified of MBB's being deleted (the original BB stays). Use that fact to our advantage and after printing a function, check if any of the IL BBs corresponds to a symbol that was not printed. This fixes pr11202. llvm-svn: 144674
This commit is contained in:
parent
1fede19ce9
commit
f11e7f1305
|
@ -736,6 +736,18 @@ void AsmPrinter::EmitFunctionBody() {
|
|||
OutStreamer.EmitRawText(StringRef("\tnop\n"));
|
||||
}
|
||||
|
||||
const Function *F = MF->getFunction();
|
||||
for (Function::const_iterator i = F->begin(), e = F->end(); i != e; ++i) {
|
||||
const BasicBlock *BB = i;
|
||||
if (!BB->hasAddressTaken())
|
||||
continue;
|
||||
MCSymbol *Sym = GetBlockAddressSymbol(BB);
|
||||
if (Sym->isDefined())
|
||||
continue;
|
||||
OutStreamer.AddComment("Address of block that was removed by CodeGen");
|
||||
OutStreamer.EmitLabel(Sym);
|
||||
}
|
||||
|
||||
// Emit target-specific gunk after the function body.
|
||||
EmitFunctionBodyEnd();
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s
|
||||
|
||||
@bb = constant [1 x i8*] [i8* blockaddress(@main, %l2)]
|
||||
|
||||
define void @main() {
|
||||
entry:
|
||||
br label %l1
|
||||
|
||||
l1: ; preds = %l2, %entry
|
||||
%a = zext i1 false to i32
|
||||
br label %l2
|
||||
|
||||
l2: ; preds = %l1
|
||||
%b = zext i1 false to i32
|
||||
br label %l1
|
||||
}
|
||||
|
||||
; CHECK: .Ltmp1: # Address of block that was removed by CodeGen
|
||||
; CHECK: .quad .Ltmp1
|
Loading…
Reference in New Issue