diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-22 21:21:57 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-22 21:21:57 +0000 |
commit | 82227ff4eb665bbf41720ebdc0dc9215a86ba838 (patch) | |
tree | 11c7f9e7fade35091635a7e23a4b79e2e46d863f /lib/CodeGen/CodeGenModule.cpp | |
parent | 74391b48b4791cded373683a3baf67314f358d50 (diff) |
fix PR3200 by making alias emission use the new infrastructure. Fold
some tests into the alias.c file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67479 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 50743149cc..f5ce056046 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -57,8 +57,8 @@ CodeGenModule::~CodeGenModule() { } void CodeGenModule::Release() { - EmitDeferred(); EmitAliases(); + EmitDeferred(); if (Runtime) if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction()) AddGlobalCtor(ObjCInitFunction); @@ -337,20 +337,26 @@ void CodeGenModule::EmitAliases() { if (!AA) continue; - const std::string& aliaseeName = AA->getAliasee(); - llvm::GlobalValue *aliasee = getModule().getNamedValue(aliaseeName); - if (!aliasee) { - // FIXME: This isn't unsupported, this is just an error, which - // sema should catch, but... - ErrorUnsupported(D, "alias referencing a missing function"); - continue; - } + const llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); + + // Unique the name through the identifier table. + const char *AliaseeName = AA->getAliasee().c_str(); + AliaseeName = getContext().Idents.get(AliaseeName).getName(); + + + + llvm::Constant *Aliasee; + if (isa<llvm::FunctionType>(DeclTy)) + Aliasee = GetOrCreateLLVMFunction(AliaseeName, DeclTy, 0); + else + Aliasee = GetOrCreateLLVMGlobal(AliaseeName, + llvm::PointerType::getUnqual(DeclTy), 0); const char *MangledName = getMangledName(D); llvm::GlobalValue *GA = - new llvm::GlobalAlias(aliasee->getType(), + new llvm::GlobalAlias(Aliasee->getType(), llvm::Function::ExternalLinkage, - MangledName, aliasee, &getModule()); + MangledName, Aliasee, &getModule()); llvm::GlobalValue *&Entry = GlobalDeclMap[MangledName]; if (Entry) { |