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 | |
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
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 28 | ||||
-rw-r--r-- | test/CodeGen/alias.c | 14 | ||||
-rw-r--r-- | test/CodeGen/rdr-6095112-alias-references-inline.c | 6 | ||||
-rw-r--r-- | test/CodeGen/rdr-6140807-alias-references-forward.c | 14 |
4 files changed, 30 insertions, 32 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) { diff --git a/test/CodeGen/alias.c b/test/CodeGen/alias.c index a625b6aea1..9de1676f4d 100644 --- a/test/CodeGen/alias.c +++ b/test/CodeGen/alias.c @@ -2,7 +2,7 @@ // RUN: grep '@g0 = common global i32 0' %t && // RUN: grep '@f1 = alias void ()\* @f0' %t && // RUN: grep '@g1 = alias i32\* @g0' %t && -// RUN: grep 'define void @f0() nounwind {' %t +// RUN: grep 'define void @f0() nounwind {' %t && void f0(void) { } extern void f1(void); @@ -11,3 +11,15 @@ extern void f1(void) __attribute((alias("f0"))); int g0; extern int g1; extern int g1 __attribute((alias("g0"))); + +// Make sure that aliases cause referenced values to be emitted. +// PR3200 +// RUN: grep 'define internal i32 @foo1()' %t && +static inline int foo1() { return 0; } +int foo() __attribute__((alias("foo1"))); + + +// RUN: grep '@bar1 = internal global i32 42' %t +static inline int bar1 = 42; +int bar() __attribute__((alias("bar1"))); + diff --git a/test/CodeGen/rdr-6095112-alias-references-inline.c b/test/CodeGen/rdr-6095112-alias-references-inline.c deleted file mode 100644 index 7407fc1f7d..0000000000 --- a/test/CodeGen/rdr-6095112-alias-references-inline.c +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: clang -triple i386-unknown-unknown --emit-llvm -o %t %s && -// RUN: grep -e "alias" %t -// XFAIL - -static inline int foo () { return 0; } -int bar () __attribute__ ((alias ("foo"))); diff --git a/test/CodeGen/rdr-6140807-alias-references-forward.c b/test/CodeGen/rdr-6140807-alias-references-forward.c deleted file mode 100644 index 509ed74849..0000000000 --- a/test/CodeGen/rdr-6140807-alias-references-forward.c +++ /dev/null @@ -1,14 +0,0 @@ -// RUN: clang -triple i386-unknown-unknown -emit-llvm -o %t %s && -// RUN: grep -e "@f = alias" %t | count 1 && -// RUN: grep -e "bitcast (i32 (i32)\\* @f to i32 (float)\\*)" %t | count 1 -// <rdar://problem/6140807> - -int f(float) __attribute__((weak, alias("x"))); - -// Make sure we replace uses properly... -int y() { - return f(1.); -} - -int x(int a) { -} |