mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 20:34:38 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98495 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c441e97220
commit
3b9d6216a4
@ -337,8 +337,7 @@ namespace llvm {
|
||||
/// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress
|
||||
/// uses of the specified basic block.
|
||||
MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
|
||||
MCSymbol *GetBlockAddressSymbol(const Function *F,
|
||||
const BasicBlock *BB) const;
|
||||
MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
|
||||
|
||||
/// EmitBasicBlockStart - This method prints the label for the specified
|
||||
/// MachineBasicBlock, an alignment (if present) and a comment describing
|
||||
|
@ -139,6 +139,11 @@ class MachineModuleInfo : public ImmutablePass {
|
||||
/// llvm.compiler.used.
|
||||
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 CallsUnwindInit;
|
||||
|
||||
@ -203,6 +208,11 @@ public:
|
||||
/// handling comsumers.
|
||||
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 ---------------------------------------------------------------===//
|
||||
|
||||
/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
|
||||
|
@ -1580,28 +1580,11 @@ bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
}
|
||||
|
||||
MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
|
||||
return GetBlockAddressSymbol(BA->getFunction(), BA->getBasicBlock());
|
||||
return MMI->getAddrLabelSymbol(BA->getBasicBlock());
|
||||
}
|
||||
|
||||
MCSymbol *AsmPrinter::GetBlockAddressSymbol(const Function *F,
|
||||
const BasicBlock *BB) const {
|
||||
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());
|
||||
MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
|
||||
return MMI->getAddrLabelSymbol(BB);
|
||||
}
|
||||
|
||||
/// 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();
|
||||
if (VerboseAsm)
|
||||
OutStreamer.AddComment("Address Taken");
|
||||
OutStreamer.EmitLabel(GetBlockAddressSymbol(BB->getParent(), BB));
|
||||
OutStreamer.EmitLabel(GetBlockAddressSymbol(BB));
|
||||
}
|
||||
|
||||
// Print the main label for the block.
|
||||
|
@ -104,6 +104,18 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {
|
||||
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-------------------------------------------------------------------===//
|
||||
|
||||
/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
|
||||
|
@ -2035,6 +2035,8 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
case ISD::EntryToken: // These nodes remain the same.
|
||||
case ISD::BasicBlock:
|
||||
case ISD::Register:
|
||||
//case ISD::VALUETYPE:
|
||||
//case ISD::CONDCODE:
|
||||
case ISD::HANDLENODE:
|
||||
case ISD::TargetConstant:
|
||||
case ISD::TargetConstantFP:
|
||||
|
@ -59,6 +59,6 @@ L1: ; preds = %L2, %bb2
|
||||
store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
|
||||
ret i32 %res.3
|
||||
}
|
||||
; ARM: .long L_BA4__foo_L5-(LPC{{.*}}+8)
|
||||
; THUMB: .long L_BA4__foo_L5-(LPC{{.*}}+4)
|
||||
; THUMB2: .long L_BA4__foo_L5
|
||||
; ARM: .long Ltmp0-(LPC{{.*}}+8)
|
||||
; THUMB: .long Ltmp0-(LPC{{.*}}+4)
|
||||
; THUMB2: .long Ltmp0
|
||||
|
@ -43,12 +43,12 @@ L2: ; preds = %L3, %bb2
|
||||
|
||||
L1: ; preds = %L2, %bb2
|
||||
%res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ] ; <i32> [#uses=1]
|
||||
; PIC: addis r4, r4, ha16(L_BA4__foo_L5-"L1$pb")
|
||||
; PIC: li r6, lo16(L_BA4__foo_L5-"L1$pb")
|
||||
; PIC: addis r4, r4, ha16(Ltmp0-"L1$pb")
|
||||
; PIC: li r6, lo16(Ltmp0-"L1$pb")
|
||||
; PIC: add r4, r4, r6
|
||||
; PIC: stw r4
|
||||
; STATIC: li r5, lo16(L_BA4__foo_L5)
|
||||
; STATIC: addis r5, r5, ha16(L_BA4__foo_L5)
|
||||
; STATIC: li r5, lo16(Ltmp0)
|
||||
; STATIC: addis r5, r5, ha16(Ltmp0)
|
||||
; STATIC: stw r5
|
||||
store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
|
||||
ret i32 %res.3
|
||||
|
@ -38,7 +38,7 @@ L2: ; preds = %L3, %bb2
|
||||
|
||||
L1: ; preds = %L2, %bb2
|
||||
%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]
|
||||
store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
|
||||
ret i32 %res.3
|
||||
|
Loading…
x
Reference in New Issue
Block a user