forked from OSchip/llvm-project
Rename temporary symbols if they conflict with artificial symbols created
by the assembler. This was blocking parsing any large .s produced by clang for example. Fixes PR8596. llvm-svn: 120603
This commit is contained in:
parent
8283f1551a
commit
5fe5f45352
|
@ -45,6 +45,10 @@ namespace llvm {
|
||||||
/// Symbols - Bindings of names to symbols.
|
/// Symbols - Bindings of names to symbols.
|
||||||
StringMap<MCSymbol*> Symbols;
|
StringMap<MCSymbol*> Symbols;
|
||||||
|
|
||||||
|
/// UsedNames - Keeps tracks of names that were used both for used declared
|
||||||
|
/// and artificial symbols.
|
||||||
|
StringMap<bool> UsedNames;
|
||||||
|
|
||||||
/// NextUniqueID - The next ID to dole out to an unnamed assembler temporary
|
/// NextUniqueID - The next ID to dole out to an unnamed assembler temporary
|
||||||
/// symbol.
|
/// symbol.
|
||||||
unsigned NextUniqueID;
|
unsigned NextUniqueID;
|
||||||
|
@ -91,6 +95,9 @@ namespace llvm {
|
||||||
BumpPtrAllocator Allocator;
|
BumpPtrAllocator Allocator;
|
||||||
|
|
||||||
void *MachOUniquingMap, *ELFUniquingMap, *COFFUniquingMap;
|
void *MachOUniquingMap, *ELFUniquingMap, *COFFUniquingMap;
|
||||||
|
|
||||||
|
MCSymbol *CreateSymbol(StringRef Name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MCContext(const MCAsmInfo &MAI);
|
explicit MCContext(const MCAsmInfo &MAI);
|
||||||
~MCContext();
|
~MCContext();
|
||||||
|
|
|
@ -57,18 +57,40 @@ MCContext::~MCContext() {
|
||||||
MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) {
|
MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) {
|
||||||
assert(!Name.empty() && "Normal symbols cannot be unnamed!");
|
assert(!Name.empty() && "Normal symbols cannot be unnamed!");
|
||||||
|
|
||||||
// Determine whether this is an assembler temporary or normal label.
|
|
||||||
bool isTemporary = Name.startswith(MAI.getPrivateGlobalPrefix());
|
|
||||||
|
|
||||||
// Do the lookup and get the entire StringMapEntry. We want access to the
|
// Do the lookup and get the entire StringMapEntry. We want access to the
|
||||||
// key if we are creating the entry.
|
// key if we are creating the entry.
|
||||||
StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
|
StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
|
||||||
if (Entry.getValue()) return Entry.getValue();
|
MCSymbol *Sym = Entry.getValue();
|
||||||
|
|
||||||
|
if (Sym)
|
||||||
|
return Sym;
|
||||||
|
|
||||||
|
Sym = CreateSymbol(Name);
|
||||||
|
Entry.setValue(Sym);
|
||||||
|
return Sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
MCSymbol *MCContext::CreateSymbol(StringRef Name) {
|
||||||
|
// Determine whether this is an assembler temporary or normal label.
|
||||||
|
bool isTemporary = Name.startswith(MAI.getPrivateGlobalPrefix());
|
||||||
|
|
||||||
|
StringMapEntry<bool> *NameEntry = &UsedNames.GetOrCreateValue(Name);
|
||||||
|
if (NameEntry->getValue()) {
|
||||||
|
assert(isTemporary && "Cannot rename non temporary symbols");
|
||||||
|
SmallString<128> NewName;
|
||||||
|
do {
|
||||||
|
Twine T = Name + Twine(NextUniqueID++);
|
||||||
|
T.toVector(NewName);
|
||||||
|
StringRef foo = NewName;
|
||||||
|
NameEntry = &UsedNames.GetOrCreateValue(foo);
|
||||||
|
} while (NameEntry->getValue());
|
||||||
|
}
|
||||||
|
NameEntry->setValue(true);
|
||||||
|
|
||||||
// Ok, the entry doesn't already exist. Have the MCSymbol object itself refer
|
// Ok, the entry doesn't already exist. Have the MCSymbol object itself refer
|
||||||
// to the copy of the string that is embedded in the StringMapEntry.
|
// to the copy of the string that is embedded in the UsedNames entry.
|
||||||
MCSymbol *Result = new (*this) MCSymbol(Entry.getKey(), isTemporary);
|
MCSymbol *Result = new (*this) MCSymbol(NameEntry->getKey(), isTemporary);
|
||||||
Entry.setValue(Result);
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,8 +101,11 @@ MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MCSymbol *MCContext::CreateTempSymbol() {
|
MCSymbol *MCContext::CreateTempSymbol() {
|
||||||
return GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix()) +
|
SmallString<128> NameSV;
|
||||||
"tmp" + Twine(NextUniqueID++));
|
Twine Name = Twine(MAI.getPrivateGlobalPrefix()) + "tmp" +
|
||||||
|
Twine(NextUniqueID++);
|
||||||
|
Name.toVector(NameSV);
|
||||||
|
return CreateSymbol(NameSV);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned MCContext::NextInstance(int64_t LocalLabelVal) {
|
unsigned MCContext::NextInstance(int64_t LocalLabelVal) {
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
// RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
|
||||||
|
|
||||||
|
.size bar, . - bar
|
||||||
|
.Ltmp0:
|
||||||
|
.size foo, .Ltmp0 - foo
|
||||||
|
|
||||||
|
// CHECK: .Ltmp0:
|
||||||
|
// CHECK: .size bar, .Ltmp0-bar
|
||||||
|
// CHECK: .Ltmp01
|
||||||
|
// CHECK: .size foo, .Ltmp01-foo
|
Loading…
Reference in New Issue