A bunch of string-related microoptimizations in Mangler.
llvm-svn: 100928
This commit is contained in:
parent
2e8ca0b86d
commit
1554e4a4bb
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue