diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-13 06:38:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-13 06:38:18 +0000 |
commit | 4813035b726e7f0a3fd17bec437185fc72a50988 (patch) | |
tree | 62052660d055912fa25fb27784a0e19c3498f777 /lib/Target/CBackend/CBackend.cpp | |
parent | 36e69ae3c1ff56828ee51d7d9a106bafdca7e46d (diff) |
change Mangler::makeNameProper to return its result in a SmallVector
instead of returning it in an std::string. Based on this change:
1. Change TargetLoweringObjectFileCOFF::getCOFFSection to take a StringRef
2. Change a bunch of targets to call makeNameProper with a smallstring,
making several of them *much* more efficient.
3. Rewrite Mangler::makeNameProper to not build names and then prepend
prefixes, not use temporary std::strings, and to avoid other crimes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93298 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CBackend/CBackend.cpp')
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index ba1a377a92..914af53c99 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -25,6 +25,7 @@ #include "llvm/IntrinsicInst.h" #include "llvm/InlineAsm.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Analysis/ConstantsScanner.h" #include "llvm/Analysis/FindUsedTypes.h" @@ -2207,12 +2208,17 @@ void CWriter::printModuleTypes(const TypeSymbolTable &TST) { // If there are no type names, exit early. if (I == End) return; + SmallString<128> TempName; + // Print out forward declarations for structure types before anything else! Out << "/* Structure forward decls */\n"; for (; I != End; ++I) { - std::string Name = "struct l_" + Mang->makeNameProper(I->first); - Out << Name << ";\n"; - TypeNames.insert(std::make_pair(I->second, Name)); + const char *Prefix = "struct l_"; + TempName.append(Prefix, Prefix+strlen(Prefix)); + Mang->makeNameProper(TempName, I->first); + Out << TempName.str() << ";\n"; + TypeNames.insert(std::make_pair(I->second, TempName.str())); + TempName.clear(); } Out << '\n'; @@ -2221,10 +2227,14 @@ void CWriter::printModuleTypes(const TypeSymbolTable &TST) { // for struct or opaque types. Out << "/* Typedefs */\n"; for (I = TST.begin(); I != End; ++I) { - std::string Name = "l_" + Mang->makeNameProper(I->first); + const char *Prefix = "l_"; + TempName.append(Prefix, Prefix+strlen(Prefix)); + Mang->makeNameProper(TempName, I->first); + Out << "typedef "; - printType(Out, I->second, false, Name); + printType(Out, I->second, false, TempName.str()); Out << ";\n"; + TempName.clear(); } Out << '\n'; |