[llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp
Chris Lattner
clattner at apple.com
Tue May 22 22:09:56 PDT 2007
> Reinstate the patch for escaping non-printing characters and allow for
> \\ to escape \. All these cases are now handled by the AsmParser.
Great, thanks again Reid!
-Chris
>
> ---
> Diffs of the changes: (+36 -19)
>
> AsmWriter.cpp | 55 +++++++++++++++++++++++++++++++++++
> +-------------------
> 1 files changed, 36 insertions(+), 19 deletions(-)
>
>
> Index: llvm/lib/VMCore/AsmWriter.cpp
> diff -u llvm/lib/VMCore/AsmWriter.cpp:1.285 llvm/lib/VMCore/
> AsmWriter.cpp:1.286
> --- llvm/lib/VMCore/AsmWriter.cpp:1.285 Tue May 22 02:00:50 2007
> +++ llvm/lib/VMCore/AsmWriter.cpp Tue May 22 14:27:35 2007
> @@ -33,6 +33,7 @@
> #include "llvm/Support/MathExtras.h"
> #include "llvm/Support/Streams.h"
> #include <algorithm>
> +#include <cctype>
> using namespace llvm;
>
> namespace llvm {
> @@ -178,17 +179,42 @@
>
> /// NameNeedsQuotes - Return true if the specified llvm name
> should be wrapped
> /// with ""'s.
> -static bool NameNeedsQuotes(const std::string &Name) {
> - if (Name[0] >= '0' && Name[0] <= '9') return true;
> - // Scan to see if we have any characters that are not on the
> "white list"
> +static std::string QuoteNameIfNeeded(const std::string &Name) {
> + std::string result;
> + bool needsQuotes = Name[0] >= '0' && Name[0] <= '9';
> + // Scan the name to see if it needs quotes and to replace funky
> chars with
> + // their octal equivalent.
> for (unsigned i = 0, e = Name.size(); i != e; ++i) {
> char C = Name[i];
> assert(C != '"' && "Illegal character in LLVM value name!");
> - if ((C < 'a' || C > 'z') && (C < 'A' || C > 'Z') && (C < '0'
> || C > '9') &&
> - C != '-' && C != '.' && C != '_')
> - return true;
> + if (isalnum(C) || C == '-' || C == '.' || C == '_')
> + result += C;
> + else if (C == '\\') {
> + needsQuotes = true;
> + result += "\\\\";
> + } else if (isprint(C)) {
> + needsQuotes = true;
> + result += C;
> + } else {
> + needsQuotes = true;
> + result += "\\";
> + char hex1 = (C >> 4) & 0x0F;
> + if (hex1 < 10)
> + result += hex1 + '0';
> + else
> + result += hex1 - 10 + 'A';
> + char hex2 = C & 0x0F;
> + if (hex2 < 10)
> + result += hex2 + '0';
> + else
> + result += hex2 - 10 + 'A';
> + }
> + }
> + if (needsQuotes) {
> + result.insert(0,"\"");
> + result += '"';
> }
> - return false;
> + return result;
> }
>
> enum PrefixType {
> @@ -202,20 +228,11 @@
> /// surrounded with ""'s (if it has special chars in it).
> static std::string getLLVMName(const std::string &Name, PrefixType
> Prefix) {
> assert(!Name.empty() && "Cannot get empty name!");
> -
> - // First character cannot start with a number...
> - if (NameNeedsQuotes(Name)) {
> - if (Prefix == GlobalPrefix)
> - return "@\"" + Name + "\"";
> - return "\"" + Name + "\"";
> - }
> -
> - // If we get here, then the identifier is legal to use as a
> "VarID".
> switch (Prefix) {
> default: assert(0 && "Bad prefix!");
> - case GlobalPrefix: return '@' + Name;
> - case LabelPrefix: return Name;
> - case LocalPrefix: return '%' + Name;
> + case GlobalPrefix: return '@' + QuoteNameIfNeeded(Name);
> + case LabelPrefix: return QuoteNameIfNeeded(Name);
> + case LocalPrefix: return '%' + QuoteNameIfNeeded(Name);
> }
> }
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list