A bunch of string-related microoptimizations in Mangler.

llvm-svn: 100928
This commit is contained in:
Benjamin Kramer 2010-04-10 16:03:31 +00:00
parent 2e8ca0b86d
commit 1554e4a4bb
1 changed files with 22 additions and 22 deletions

View File

@ -1305,7 +1305,7 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
mangleCalledExpression(CE->getCallee(), CE->getNumArgs()); mangleCalledExpression(CE->getCallee(), CE->getNumArgs());
for (unsigned I = 0, N = CE->getNumArgs(); I != N; ++I) for (unsigned I = 0, N = CE->getNumArgs(); I != N; ++I)
mangleExpression(CE->getArg(I)); mangleExpression(CE->getArg(I));
Out << "E"; Out << 'E';
break; break;
} }
@ -1349,9 +1349,9 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
Out << "cv"; Out << "cv";
mangleType(CE->getType()); mangleType(CE->getType());
if (N != 1) Out << "_"; if (N != 1) Out << '_';
for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I));
if (N != 1) Out << "E"; if (N != 1) Out << 'E';
break; break;
} }
@ -1362,21 +1362,21 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
Out << "cv"; Out << "cv";
mangleType(CE->getType()); mangleType(CE->getType());
if (N != 1) Out << "_"; if (N != 1) Out << '_';
for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I));
if (N != 1) Out << "E"; if (N != 1) Out << 'E';
break; break;
} }
case Expr::SizeOfAlignOfExprClass: { case Expr::SizeOfAlignOfExprClass: {
const SizeOfAlignOfExpr *SAE = cast<SizeOfAlignOfExpr>(E); const SizeOfAlignOfExpr *SAE = cast<SizeOfAlignOfExpr>(E);
if (SAE->isSizeOf()) Out << "s"; if (SAE->isSizeOf()) Out << 's';
else Out << "a"; else Out << 'a';
if (SAE->isArgumentType()) { if (SAE->isArgumentType()) {
Out << "t"; Out << 't';
mangleType(SAE->getArgumentType()); mangleType(SAE->getArgumentType());
} else { } else {
Out << "z"; Out << 'z';
mangleExpression(SAE->getArgumentExpr()); mangleExpression(SAE->getArgumentExpr());
} }
break; break;
@ -1504,7 +1504,7 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
case Expr::FloatingLiteralClass: { case Expr::FloatingLiteralClass: {
const FloatingLiteral *FL = cast<FloatingLiteral>(E); const FloatingLiteral *FL = cast<FloatingLiteral>(E);
Out << "L"; Out << 'L';
mangleType(FL->getType()); mangleType(FL->getType());
// TODO: avoid this copy with careful stream management. // TODO: avoid this copy with careful stream management.
@ -1512,12 +1512,12 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
FL->getValue().bitcastToAPInt().toString(Buffer, 16, false); FL->getValue().bitcastToAPInt().toString(Buffer, 16, false);
Out.write(Buffer.data(), Buffer.size()); Out.write(Buffer.data(), Buffer.size());
Out << "E"; Out << 'E';
break; break;
} }
case Expr::CharacterLiteralClass: case Expr::CharacterLiteralClass:
Out << "L"; Out << 'L';
mangleType(E->getType()); mangleType(E->getType());
Out << cast<CharacterLiteral>(E)->getValue(); Out << cast<CharacterLiteral>(E)->getValue();
Out << 'E'; Out << 'E';
@ -1579,20 +1579,20 @@ void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL, void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL,
const TemplateArgumentList &AL) { const TemplateArgumentList &AL) {
// <template-args> ::= I <template-arg>+ E // <template-args> ::= I <template-arg>+ E
Out << "I"; Out << 'I';
for (unsigned i = 0, e = AL.size(); i != e; ++i) for (unsigned i = 0, e = AL.size(); i != e; ++i)
mangleTemplateArg(PL.getParam(i), AL[i]); mangleTemplateArg(PL.getParam(i), AL[i]);
Out << "E"; Out << 'E';
} }
void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL, void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL,
const TemplateArgument *TemplateArgs, const TemplateArgument *TemplateArgs,
unsigned NumTemplateArgs) { unsigned NumTemplateArgs) {
// <template-args> ::= I <template-arg>+ E // <template-args> ::= I <template-arg>+ E
Out << "I"; Out << 'I';
for (unsigned i = 0; i != NumTemplateArgs; ++i) for (unsigned i = 0; i != NumTemplateArgs; ++i)
mangleTemplateArg(PL.getParam(i), TemplateArgs[i]); mangleTemplateArg(PL.getParam(i), TemplateArgs[i]);
Out << "E"; Out << 'E';
} }
void CXXNameMangler::mangleTemplateArg(const NamedDecl *P, void CXXNameMangler::mangleTemplateArg(const NamedDecl *P,
@ -1688,8 +1688,7 @@ bool CXXNameMangler::mangleSubstitution(QualType T) {
} }
bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
llvm::DenseMap<uintptr_t, unsigned>::iterator I = llvm::DenseMap<uintptr_t, unsigned>::iterator I = Substitutions.find(Ptr);
Substitutions.find(Ptr);
if (I == Substitutions.end()) if (I == Substitutions.end())
return false; return false;
@ -1701,9 +1700,8 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
// <seq-id> is encoded in base-36, using digits and upper case letters. // <seq-id> is encoded in base-36, using digits and upper case letters.
char Buffer[10]; char Buffer[10];
char *BufferPtr = Buffer + 9; char *BufferPtr = llvm::array_endof(Buffer);
*BufferPtr = 0;
if (SeqID == 0) *--BufferPtr = '0'; if (SeqID == 0) *--BufferPtr = '0';
while (SeqID) { while (SeqID) {
@ -1715,7 +1713,9 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
SeqID /= 36; SeqID /= 36;
} }
Out << 'S' << BufferPtr << '_'; Out << 'S'
<< llvm::StringRef(BufferPtr, llvm::array_endof(Buffer)-BufferPtr)
<< '_';
} }
return true; return true;
@ -1990,7 +1990,7 @@ void MangleContext::mangleCXXCtorVtable(const CXXRecordDecl *RD, int64_t Offset,
Mangler.getStream() << "_ZTC"; Mangler.getStream() << "_ZTC";
Mangler.mangleName(RD); Mangler.mangleName(RD);
Mangler.getStream() << Offset; Mangler.getStream() << Offset;
Mangler.getStream() << "_"; Mangler.getStream() << '_';
Mangler.mangleName(Type); Mangler.mangleName(Type);
} }