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
This commit is contained in:
Anton Korobeynikov 2009-09-18 16:57:42 +00:00
parent bf4c56d82b
commit 592638ae05
8 changed files with 55 additions and 9 deletions

View File

@ -95,6 +95,10 @@ namespace llvm {
/// AllowQuotesInName - This is true if the assembler allows for complex /// AllowQuotesInName - This is true if the assembler allows for complex
/// symbol names to be surrounded in quotes. This defaults to false. /// symbol names to be surrounded in quotes. This defaults to false.
bool AllowQuotesInName; bool AllowQuotesInName;
/// AllowNameToStartWithDigit - This is true if the assembler allows symbol
/// names to start with a digit (e.g., "0x0021"). This defaults to false.
bool AllowNameToStartWithDigit;
//===--- Data Emission Directives -------------------------------------===// //===--- Data Emission Directives -------------------------------------===//
@ -354,6 +358,9 @@ namespace llvm {
bool doesAllowQuotesInName() const { bool doesAllowQuotesInName() const {
return AllowQuotesInName; return AllowQuotesInName;
} }
bool doesAllowNameToStartWithDigit() const {
return AllowNameToStartWithDigit;
}
const char *getZeroDirective() const { const char *getZeroDirective() const {
return ZeroDirective; return ZeroDirective;
} }

View File

@ -51,6 +51,10 @@ private:
/// the space character. By default, this is false. /// the space character. By default, this is false.
bool UseQuotes; bool UseQuotes;
/// SymbolsCanStartWithDigit - If this is set, the target allows symbols to
/// start with digits (e.g., "0x0021"). By default, this is false.
bool SymbolsCanStartWithDigit;
/// AnonGlobalIDs - We need to give global values the same name every time /// AnonGlobalIDs - We need to give global values the same name every time
/// they are mangled. This keeps track of the number we give to anonymous /// they are mangled. This keeps track of the number we give to anonymous
/// ones. /// ones.
@ -75,9 +79,13 @@ public:
/// strings for assembler labels. /// strings for assembler labels.
void setUseQuotes(bool Val) { UseQuotes = Val; } void setUseQuotes(bool Val) { UseQuotes = Val; }
/// setSymbolsCanStartWithDigit - If SymbolsCanStartWithDigit is set to true,
/// this target allows symbols to start with digits.
void setSymbolsCanStartWithDigit(bool Val) { SymbolsCanStartWithDigit = Val; }
/// Acceptable Characters - This allows the target to specify which characters /// Acceptable Characters - This allows the target to specify which characters
/// are acceptable to the assembler without being mangled. By default we /// are acceptable to the assembler without being mangled. By default we
/// allow letters, numbers, '_', '$', and '.', which is what GAS accepts. /// allow letters, numbers, '_', '$', '.', which is what GAS accepts, and '@'.
void markCharAcceptable(unsigned char X) { void markCharAcceptable(unsigned char X) {
AcceptableChars[X/32] |= 1 << (X&31); AcceptableChars[X/32] |= 1 << (X&31);
} }

View File

@ -106,6 +106,9 @@ bool AsmPrinter::doInitialization(Module &M) {
if (MAI->doesAllowQuotesInName()) if (MAI->doesAllowQuotesInName())
Mang->setUseQuotes(true); Mang->setUseQuotes(true);
if (MAI->doesAllowNameToStartWithDigit())
Mang->setSymbolsCanStartWithDigit(true);
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
assert(MI && "AsmPrinter didn't require GCModuleInfo?"); assert(MI && "AsmPrinter didn't require GCModuleInfo?");

View File

@ -34,6 +34,7 @@ MCAsmInfo::MCAsmInfo() {
InlineAsmEnd = "NO_APP"; InlineAsmEnd = "NO_APP";
AssemblerDialect = 0; AssemblerDialect = 0;
AllowQuotesInName = false; AllowQuotesInName = false;
AllowNameToStartWithDigit = false;
ZeroDirective = "\t.zero\t"; ZeroDirective = "\t.zero\t";
ZeroDirectiveSuffix = 0; ZeroDirectiveSuffix = 0;
AsciiDirective = "\t.ascii\t"; AsciiDirective = "\t.ascii\t";

View File

@ -38,8 +38,9 @@ static void MangleLetter(raw_ostream &OS, unsigned char C) {
static bool NameNeedsEscaping(const StringRef &Str, const MCAsmInfo &MAI) { static bool NameNeedsEscaping(const StringRef &Str, const MCAsmInfo &MAI) {
assert(!Str.empty() && "Cannot create an empty MCSymbol"); assert(!Str.empty() && "Cannot create an empty MCSymbol");
// If the first character is a number, we need quotes. // If the first character is a number and the target does not allow this, we
if (Str[0] >= '0' && Str[0] <= '9') // need quotes.
if (!MAI.doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9')
return true; return true;
// If any of the characters in the string is an unacceptable character, force // 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; return false;
} }
static void PrintMangledName(raw_ostream &OS, StringRef Str) { static void PrintMangledName(raw_ostream &OS, StringRef Str,
// The first character is not allowed to be a number. const MCAsmInfo &MAI) {
if (Str[0] >= '0' && Str[0] <= '9') { // 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]); MangleLetter(OS, Str[0]);
Str = Str.substr(1); 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. // On systems that do not allow quoted names, print with mangling.
if (!MAI->doesAllowQuotesInName()) 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 // If the string contains a double quote or newline, we still have to mangle
// it. // it.

View File

@ -16,4 +16,5 @@ using namespace llvm;
MSP430MCAsmInfo::MSP430MCAsmInfo(const Target &T, const StringRef &TT) { MSP430MCAsmInfo::MSP430MCAsmInfo(const Target &T, const StringRef &TT) {
AlignmentIsInBytes = false; AlignmentIsInBytes = false;
AllowNameToStartWithDigit = true;
} }

View File

@ -47,8 +47,9 @@ std::string Mangler::makeNameProper(const std::string &X,
++I; // Skip over the marker. ++I; // Skip over the marker.
} }
// Mangle the first letter specially, don't allow numbers. // Mangle the first letter specially, don't allow numbers unless the target
if (*I >= '0' && *I <= '9') // explicitly allows them.
if (!SymbolsCanStartWithDigit && *I >= '0' && *I <= '9')
Result += MangleLetter(*I++); Result += MangleLetter(*I++);
for (std::string::const_iterator E = X.end(); I != E; ++I) { for (std::string::const_iterator E = X.end(); I != E; ++I) {

View File

@ -0,0 +1,22 @@
; RUN: llc < %s | grep 0x0021 | count 2
; PR4776
target datalayout = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"
target triple = "msp430-unknown-unknown"
@"\010x0021" = common global i8 0, align 1 ; <i8*> [#uses=2]
define zeroext i8 @foo(i8 zeroext %x) nounwind {
entry:
%retval = alloca i8 ; <i8*> [#uses=2]
%x.addr = alloca i8 ; <i8*> [#uses=2]
%tmp = alloca i8, align 1 ; <i8*> [#uses=2]
store i8 %x, i8* %x.addr
%tmp1 = volatile load i8* @"\010x0021" ; <i8> [#uses=1]
store i8 %tmp1, i8* %tmp
%tmp2 = load i8* %x.addr ; <i8> [#uses=1]
volatile store i8 %tmp2, i8* @"\010x0021"
%tmp3 = load i8* %tmp ; <i8> [#uses=1]
store i8 %tmp3, i8* %retval
%0 = load i8* %retval ; <i8> [#uses=1]
ret i8 %0
}