fix AsmPrinter::GetBlockAddressSymbol to always return a unique

label instead of trying to form one based on the BB name (which
causes collisions if the name is empty).  This fixes PR6608

llvm-svn: 98495
This commit is contained in:
Chris Lattner 2010-03-14 17:53:23 +00:00
parent 87dd2d6388
commit 9efbbcbe45
8 changed files with 37 additions and 31 deletions

View File

@ -337,8 +337,7 @@ namespace llvm {
/// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress /// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress
/// uses of the specified basic block. /// uses of the specified basic block.
MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const; MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
MCSymbol *GetBlockAddressSymbol(const Function *F, MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
const BasicBlock *BB) const;
/// EmitBasicBlockStart - This method prints the label for the specified /// EmitBasicBlockStart - This method prints the label for the specified
/// MachineBasicBlock, an alignment (if present) and a comment describing /// MachineBasicBlock, an alignment (if present) and a comment describing

View File

@ -139,6 +139,11 @@ class MachineModuleInfo : public ImmutablePass {
/// llvm.compiler.used. /// llvm.compiler.used.
SmallPtrSet<const Function *, 32> UsedFunctions; SmallPtrSet<const Function *, 32> UsedFunctions;
/// AddrLabelSymbols - This map keeps track of which symbol is being used for
/// the specified basic block's address of label.
DenseMap<AssertingVH<BasicBlock>, MCSymbol*> AddrLabelSymbols;
bool CallsEHReturn; bool CallsEHReturn;
bool CallsUnwindInit; bool CallsUnwindInit;
@ -203,6 +208,11 @@ public:
/// handling comsumers. /// handling comsumers.
std::vector<MachineMove> &getFrameMoves() { return FrameMoves; } std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
/// getAddrLabelSymbol - Return the symbol to be used for the specified basic
/// block when its address is taken. This cannot be its normal LBB label
/// because the block may be accessed outside its containing function.
MCSymbol *getAddrLabelSymbol(const BasicBlock *BB);
//===- EH ---------------------------------------------------------------===// //===- EH ---------------------------------------------------------------===//
/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the

View File

@ -1580,28 +1580,11 @@ bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
} }
MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const { MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
return GetBlockAddressSymbol(BA->getFunction(), BA->getBasicBlock()); return MMI->getAddrLabelSymbol(BA->getBasicBlock());
} }
MCSymbol *AsmPrinter::GetBlockAddressSymbol(const Function *F, MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
const BasicBlock *BB) const { return MMI->getAddrLabelSymbol(BB);
assert(BB->hasName() &&
"Address of anonymous basic block not supported yet!");
// This code must use the function name itself, and not the function number,
// since it must be possible to generate the label name from within other
// functions.
SmallString<60> FnName;
Mang->getNameWithPrefix(FnName, F, false);
// FIXME: THIS IS BROKEN IF THE LLVM BASIC BLOCK DOESN'T HAVE A NAME!
SmallString<60> NameResult;
Mang->getNameWithPrefix(NameResult,
StringRef("BA") + Twine((unsigned)FnName.size()) +
"_" + FnName.str() + "_" + BB->getName(),
Mangler::Private);
return OutContext.GetOrCreateTemporarySymbol(NameResult.str());
} }
/// GetCPISymbol - Return the symbol for the specified constant pool entry. /// GetCPISymbol - Return the symbol for the specified constant pool entry.
@ -1730,7 +1713,7 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
const BasicBlock *BB = MBB->getBasicBlock(); const BasicBlock *BB = MBB->getBasicBlock();
if (VerboseAsm) if (VerboseAsm)
OutStreamer.AddComment("Address Taken"); OutStreamer.AddComment("Address Taken");
OutStreamer.EmitLabel(GetBlockAddressSymbol(BB->getParent(), BB)); OutStreamer.EmitLabel(GetBlockAddressSymbol(BB));
} }
// Print the main label for the block. // Print the main label for the block.

View File

@ -104,6 +104,18 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {
UsedFunctions.insert(F); UsedFunctions.insert(F);
} }
/// getAddrLabelSymbol - Return the symbol to be used for the specified basic
/// block when its address is taken. This cannot be its normal LBB label
/// because the block may be accessed outside its containing function.
MCSymbol *MachineModuleInfo::getAddrLabelSymbol(const BasicBlock *BB) {
assert(BB->hasAddressTaken() &&
"Shouldn't get label for block without address taken");
MCSymbol *&Entry = AddrLabelSymbols[const_cast<BasicBlock*>(BB)];
if (Entry) return Entry;
return Entry = Context.CreateTempSymbol();
}
//===-EH-------------------------------------------------------------------===// //===-EH-------------------------------------------------------------------===//
/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the

View File

@ -2035,6 +2035,8 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
case ISD::EntryToken: // These nodes remain the same. case ISD::EntryToken: // These nodes remain the same.
case ISD::BasicBlock: case ISD::BasicBlock:
case ISD::Register: case ISD::Register:
//case ISD::VALUETYPE:
//case ISD::CONDCODE:
case ISD::HANDLENODE: case ISD::HANDLENODE:
case ISD::TargetConstant: case ISD::TargetConstant:
case ISD::TargetConstantFP: case ISD::TargetConstantFP:

View File

@ -59,6 +59,6 @@ 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 L_BA4__foo_L5-(LPC{{.*}}+8) ; ARM: .long Ltmp0-(LPC{{.*}}+8)
; THUMB: .long L_BA4__foo_L5-(LPC{{.*}}+4) ; THUMB: .long Ltmp0-(LPC{{.*}}+4)
; THUMB2: .long L_BA4__foo_L5 ; THUMB2: .long Ltmp0

View File

@ -43,12 +43,12 @@ L2: ; preds = %L3, %bb2
L1: ; preds = %L2, %bb2 L1: ; preds = %L2, %bb2
%res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ] ; <i32> [#uses=1] %res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ] ; <i32> [#uses=1]
; PIC: addis r4, r4, ha16(L_BA4__foo_L5-"L1$pb") ; PIC: addis r4, r4, ha16(Ltmp0-"L1$pb")
; PIC: li r6, lo16(L_BA4__foo_L5-"L1$pb") ; PIC: li r6, lo16(Ltmp0-"L1$pb")
; PIC: add r4, r4, r6 ; PIC: add r4, r4, r6
; PIC: stw r4 ; PIC: stw r4
; STATIC: li r5, lo16(L_BA4__foo_L5) ; STATIC: li r5, lo16(Ltmp0)
; STATIC: addis r5, r5, ha16(L_BA4__foo_L5) ; STATIC: addis r5, r5, ha16(Ltmp0)
; STATIC: stw r5 ; STATIC: stw r5
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

View File

@ -38,7 +38,7 @@ L2: ; preds = %L3, %bb2
L1: ; preds = %L2, %bb2 L1: ; preds = %L2, %bb2
%res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ] ; <i32> [#uses=1] %res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ] ; <i32> [#uses=1]
; CHECK: ldap r11, .LBA3_foo_L5 ; CHECK: ldap r11, .Ltmp0
; CHECK: stw r11, dp[nextaddr] ; CHECK: stw r11, dp[nextaddr]
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