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:
Rafael Espindola 2011-11-15 19:08:46 +00:00
parent 1fede19ce9
commit f11e7f1305
2 changed files with 31 additions and 0 deletions

View File

@ -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();

View File

@ -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