summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2009-09-18 16:57:42 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2009-09-18 16:57:42 +0000
commit592638ae05d06aed2752d919d4bb520a202e0596 (patch)
treeacee09ca34534bf5669573d19e34226238d56161 /llvm/lib
parentbf4c56d82b1fef3eae36d4acb43aea296e9e464c (diff)
downloadbcm5719-llvm-592638ae05d06aed2752d919d4bb520a202e0596.tar.gz
bcm5719-llvm-592638ae05d06aed2752d919d4bb520a202e0596.zip
Allow symbols to start from the digit if target requests it. This allows, e.g. pinning
variables to specified absolute address. Make use of this feature for MSP430. This unbreaks PR4776. llvm-svn: 82227
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp3
-rw-r--r--llvm/lib/MC/MCAsmInfo.cpp1
-rw-r--r--llvm/lib/MC/MCSymbol.cpp15
-rw-r--r--llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp1
-rw-r--r--llvm/lib/VMCore/Mangler.cpp5
5 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 6a9428737fa..e29bff5f66a 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -106,6 +106,9 @@ bool AsmPrinter::doInitialization(Module &M) {
if (MAI->doesAllowQuotesInName())
Mang->setUseQuotes(true);
+
+ if (MAI->doesAllowNameToStartWithDigit())
+ Mang->setSymbolsCanStartWithDigit(true);
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp
index 1bba6a3dea0..74fb930fbc1 100644
--- a/llvm/lib/MC/MCAsmInfo.cpp
+++ b/llvm/lib/MC/MCAsmInfo.cpp
@@ -34,6 +34,7 @@ MCAsmInfo::MCAsmInfo() {
InlineAsmEnd = "NO_APP";
AssemblerDialect = 0;
AllowQuotesInName = false;
+ AllowNameToStartWithDigit = false;
ZeroDirective = "\t.zero\t";
ZeroDirectiveSuffix = 0;
AsciiDirective = "\t.ascii\t";
diff --git a/llvm/lib/MC/MCSymbol.cpp b/llvm/lib/MC/MCSymbol.cpp
index 832f8fbcbb4..86ff3f3bddb 100644
--- a/llvm/lib/MC/MCSymbol.cpp
+++ b/llvm/lib/MC/MCSymbol.cpp
@@ -38,8 +38,9 @@ static void MangleLetter(raw_ostream &OS, unsigned char C) {
static bool NameNeedsEscaping(const StringRef &Str, const MCAsmInfo &MAI) {
assert(!Str.empty() && "Cannot create an empty MCSymbol");
- // If the first character is a number, we need quotes.
- if (Str[0] >= '0' && Str[0] <= '9')
+ // If the first character is a number and the target does not allow this, we
+ // need quotes.
+ if (!MAI.doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9')
return true;
// If any of the characters in the string is an unacceptable character, force
@@ -50,9 +51,11 @@ static bool NameNeedsEscaping(const StringRef &Str, const MCAsmInfo &MAI) {
return false;
}
-static void PrintMangledName(raw_ostream &OS, StringRef Str) {
- // The first character is not allowed to be a number.
- if (Str[0] >= '0' && Str[0] <= '9') {
+static void PrintMangledName(raw_ostream &OS, StringRef Str,
+ const MCAsmInfo &MAI) {
+ // The first character is not allowed to be a number unless the target
+ // explicitly allows it.
+ if (!MAI.doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') {
MangleLetter(OS, Str[0]);
Str = Str.substr(1);
}
@@ -91,7 +94,7 @@ void MCSymbol::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
// On systems that do not allow quoted names, print with mangling.
if (!MAI->doesAllowQuotesInName())
- return PrintMangledName(OS, getName());
+ return PrintMangledName(OS, getName(), *MAI);
// If the string contains a double quote or newline, we still have to mangle
// it.
diff --git a/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp b/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp
index 2309a5f63e6..069313e2ef0 100644
--- a/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp
+++ b/llvm/lib/Target/MSP430/MSP430MCAsmInfo.cpp
@@ -16,4 +16,5 @@ using namespace llvm;
MSP430MCAsmInfo::MSP430MCAsmInfo(const Target &T, const StringRef &TT) {
AlignmentIsInBytes = false;
+ AllowNameToStartWithDigit = true;
}
diff --git a/llvm/lib/VMCore/Mangler.cpp b/llvm/lib/VMCore/Mangler.cpp
index e0e224826de..a5fbf264c62 100644
--- a/llvm/lib/VMCore/Mangler.cpp
+++ b/llvm/lib/VMCore/Mangler.cpp
@@ -47,8 +47,9 @@ std::string Mangler::makeNameProper(const std::string &X,
++I; // Skip over the marker.
}
- // Mangle the first letter specially, don't allow numbers.
- if (*I >= '0' && *I <= '9')
+ // Mangle the first letter specially, don't allow numbers unless the target
+ // explicitly allows them.
+ if (!SymbolsCanStartWithDigit && *I >= '0' && *I <= '9')
Result += MangleLetter(*I++);
for (std::string::const_iterator E = X.end(); I != E; ++I) {
OpenPOWER on IntegriCloud