Index: llvm/trunk/include/llvm/ADT/StringExtras.h =================================================================== --- llvm/trunk/include/llvm/ADT/StringExtras.h +++ llvm/trunk/include/llvm/ADT/StringExtras.h @@ -19,6 +19,7 @@ #include namespace llvm { +class raw_ostream; template class SmallVectorImpl; /// hexdigit - Return the hexadecimal character for the @@ -150,6 +151,10 @@ } } +/// PrintEscapedString - Print each character of the specified string, escaping +/// it if it is not printable or if it is an escape char. +void PrintEscapedString(StringRef Name, raw_ostream &Out); + template inline std::string join_impl(IteratorT Begin, IteratorT End, StringRef Separator, std::input_iterator_tag) { Index: llvm/trunk/lib/IR/AsmWriter.cpp =================================================================== --- llvm/trunk/lib/IR/AsmWriter.cpp +++ llvm/trunk/lib/IR/AsmWriter.cpp @@ -337,9 +337,7 @@ } } -// PrintEscapedString - Print each character of the specified string, escaping -// it if it is not printable or if it is an escape char. -static void PrintEscapedString(StringRef Name, raw_ostream &Out) { +void llvm::PrintEscapedString(StringRef Name, raw_ostream &Out) { for (unsigned i = 0, e = Name.size(); i != e; ++i) { unsigned char C = Name[i]; if (isprint(C) && C != '\\' && C != '"') Index: llvm/trunk/lib/IR/Attributes.cpp =================================================================== --- llvm/trunk/lib/IR/Attributes.cpp +++ llvm/trunk/lib/IR/Attributes.cpp @@ -381,10 +381,18 @@ std::string Result; Result += (Twine('"') + getKindAsString() + Twine('"')).str(); - StringRef Val = pImpl->getValueAsString(); - if (Val.empty()) return Result; + std::string AttrVal = pImpl->getValueAsString(); + if (AttrVal.empty()) return Result; - Result += ("=\"" + Val + Twine('"')).str(); + // Since some attribute strings contain special characters that cannot be + // printable, those have to be escaped to make the attribute value printable + // as is. e.g. "\01__gnu_mcount_nc" + { + raw_string_ostream OS(Result); + OS << "=\""; + PrintEscapedString(AttrVal, OS); + OS << "\""; + } return Result; }