зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
74391b48b4
Коммит
82227ff4eb
|
@ -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) {
|
||||
|
|
|
@ -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")));
|
||||
|
||||
|
|
|
@ -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")));
|
|
@ -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) {
|
||||
}
|
Загрузка…
Ссылка в новой задаче