Move code to add a type name to a TagDecl type out into a helper function. No functionality change.

llvm-svn: 129669
This commit is contained in:
Anders Carlsson 2011-04-17 21:36:59 +00:00
parent 4604bddc07
commit c58f8cb7fc
2 changed files with 37 additions and 25 deletions

View File

@ -65,6 +65,36 @@ void CodeGenTypes::HandleLateResolvedPointers() {
}
}
void CodeGenTypes::addTagTypeName(const TagDecl *TD, const llvm::Type *Ty,
llvm::StringRef suffix) {
llvm::SmallString<256> TypeName;
llvm::raw_svector_ostream OS(TypeName);
OS << TD->getKindName() << '.';
// Name the codegen type after the typedef name
// if there is no tag type name available
if (TD->getIdentifier()) {
// FIXME: We should not have to check for a null decl context here.
// Right now we do it because the implicit Obj-C decls don't have one.
if (TD->getDeclContext())
OS << TD->getQualifiedNameAsString();
else
TD->printName(OS);
} else if (const TypedefNameDecl *TDD = TD->getTypedefNameForAnonDecl()) {
// FIXME: We should not have to check for a null decl context here.
// Right now we do it because the implicit Obj-C decls don't have one.
if (TDD->getDeclContext())
OS << TDD->getQualifiedNameAsString();
else
TDD->printName(OS);
} else
OS << "anon";
if (!suffix.empty())
OS << suffix;
TheModule.addTypeName(OS.str(), Ty);
}
/// ConvertType - Convert the specified type to its LLVM form.
const llvm::Type *CodeGenTypes::ConvertType(QualType T, bool IsRecursive) {
@ -373,31 +403,8 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
case Type::Enum: {
const TagDecl *TD = cast<TagType>(Ty).getDecl();
const llvm::Type *Res = ConvertTagDeclType(TD);
llvm::SmallString<256> TypeName;
llvm::raw_svector_ostream OS(TypeName);
OS << TD->getKindName() << '.';
// Name the codegen type after the typedef name
// if there is no tag type name available
if (TD->getIdentifier()) {
// FIXME: We should not have to check for a null decl context here.
// Right now we do it because the implicit Obj-C decls don't have one.
if (TD->getDeclContext())
OS << TD->getQualifiedNameAsString();
else
TD->printName(OS);
} else if (const TypedefNameDecl *TDD = TD->getTypedefNameForAnonDecl()) {
// FIXME: We should not have to check for a null decl context here.
// Right now we do it because the implicit Obj-C decls don't have one.
if (TDD->getDeclContext())
OS << TDD->getQualifiedNameAsString();
else
TDD->printName(OS);
} else
OS << "anon";
TheModule.addTypeName(OS.str(), Res);
addTagTypeName(TD, Res, llvm::StringRef());
return Res;
}

View File

@ -101,6 +101,11 @@ private:
/// used to handle cyclic structures properly.
void HandleLateResolvedPointers();
/// addTagTypeName - Compute a name from the given tag decl with an optional
/// suffix and name the given LLVM type using it.
void addTagTypeName(const TagDecl *TD, const llvm::Type *Ty,
llvm::StringRef suffix);
public:
CodeGenTypes(ASTContext &Ctx, llvm::Module &M, const llvm::TargetData &TD,
const ABIInfo &Info, CGCXXABI &CXXABI);