diff options
author | Chris Lattner <sabre@nondot.org> | 2005-11-10 19:30:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-11-10 19:30:07 +0000 |
commit | ac8c83428886adcd6b6b2290252db87be184c71c (patch) | |
tree | 7d7db28cbc47a80f677f1784b97dc2ff7f8ffba6 /lib/VMCore/Mangler.cpp | |
parent | 6c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8a (diff) | |
download | external_llvm-ac8c83428886adcd6b6b2290252db87be184c71c.zip external_llvm-ac8c83428886adcd6b6b2290252db87be184c71c.tar.gz external_llvm-ac8c83428886adcd6b6b2290252db87be184c71c.tar.bz2 |
Add a new option for targets that accept quoted labels.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24283 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Mangler.cpp')
-rw-r--r-- | lib/VMCore/Mangler.cpp | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/lib/VMCore/Mangler.cpp b/lib/VMCore/Mangler.cpp index 0311180..418eb9a 100644 --- a/lib/VMCore/Mangler.cpp +++ b/lib/VMCore/Mangler.cpp @@ -30,24 +30,51 @@ static std::string MangleLetter(unsigned char C) { /// std::string Mangler::makeNameProper(const std::string &X, const char *Prefix) { std::string Result; - - // If X does not start with (char)1, add the prefix. - std::string::const_iterator I = X.begin(); - if (*I != 1) - Result = Prefix; - else - ++I; // Skip over the marker. - // Mangle the first letter specially, don't allow numbers... - if (*I >= '0' && *I <= '9') - Result += MangleLetter(*I++); - - for (std::string::const_iterator E = X.end(); I != E; ++I) - if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') && - (*I < '0' || *I > '9') && *I != '_' && *I != '$') - Result += MangleLetter(*I); + if (!UseQuotes) { + // If X does not start with (char)1, add the prefix. + std::string::const_iterator I = X.begin(); + if (*I != 1) + Result = Prefix; else - Result += *I; + ++I; // Skip over the marker. + + // Mangle the first letter specially, don't allow numbers... + if (*I >= '0' && *I <= '9') + Result += MangleLetter(*I++); + + for (std::string::const_iterator E = X.end(); I != E; ++I) + if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') && + (*I < '0' || *I > '9') && *I != '_' && *I != '$') + Result += MangleLetter(*I); + else + Result += *I; + } else { + bool NeedsQuotes = false; + + // If X does not start with (char)1, add the prefix. + std::string::const_iterator I = X.begin(); + if (*I != 1) + Result = Prefix; + else + ++I; // Skip over the marker. + + // If the first character is a number, we need quotes. + if (*I >= '0' && *I <= '9') + NeedsQuotes = true; + + for (std::string::const_iterator E = X.end(); I != E; ++I) + if (*I == '"') + Result += "_QQ_"; + else { + if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') && + (*I < '0' || *I > '9') && *I != '_' && *I != '$' && *I != '.') + NeedsQuotes = true; + Result += *I; + } + if (NeedsQuotes) + Result = '"' + Result + '"'; + } return Result; } @@ -119,7 +146,7 @@ void Mangler::InsertName(GlobalValue *GV, Mangler::Mangler(Module &M, const char *prefix) - : Prefix(prefix), Count(0), TypeCounter(0) { + : Prefix(prefix), UseQuotes(false), Count(0), TypeCounter(0) { // Calculate which global values have names that will collide when we throw // away type information. std::map<std::string, GlobalValue*> Names; |