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
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 5074314..f5ce056 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -57,8 +57,8 @@
}
void CodeGenModule::Release() {
- EmitDeferred();
EmitAliases();
+ EmitDeferred();
if (Runtime)
if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction())
AddGlobalCtor(ObjCInitFunction);
@@ -337,20 +337,26 @@
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) {