aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-22 21:21:57 +0000
committerChris Lattner <sabre@nondot.org>2009-03-22 21:21:57 +0000
commit82227ff4eb665bbf41720ebdc0dc9215a86ba838 (patch)
tree11c7f9e7fade35091635a7e23a4b79e2e46d863f
parent74391b48b4791cded373683a3baf67314f358d50 (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.cpp28
-rw-r--r--test/CodeGen/alias.c14
-rw-r--r--test/CodeGen/rdr-6095112-alias-references-inline.c6
-rw-r--r--test/CodeGen/rdr-6140807-alias-references-forward.c14
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) {
-}