forked from OSchip/llvm-project
IRgen support for alias of global variable.
- PR3818. llvm-svn: 67297
This commit is contained in:
parent
8d6ab2afa6
commit
4e004ed124
|
@ -369,7 +369,7 @@ void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
|
||||||
|
|
||||||
void CodeGenModule::EmitAliases() {
|
void CodeGenModule::EmitAliases() {
|
||||||
for (unsigned i = 0, e = Aliases.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Aliases.size(); i != e; ++i) {
|
||||||
const FunctionDecl *D = Aliases[i];
|
const ValueDecl *D = Aliases[i];
|
||||||
const AliasAttr *AA = D->getAttr<AliasAttr>();
|
const AliasAttr *AA = D->getAttr<AliasAttr>();
|
||||||
|
|
||||||
// This is something of a hack, if the FunctionDecl got overridden
|
// This is something of a hack, if the FunctionDecl got overridden
|
||||||
|
@ -380,7 +380,7 @@ void CodeGenModule::EmitAliases() {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const std::string& aliaseeName = AA->getAliasee();
|
const std::string& aliaseeName = AA->getAliasee();
|
||||||
llvm::Function *aliasee = getModule().getFunction(aliaseeName);
|
llvm::GlobalValue *aliasee = getModule().getNamedValue(aliaseeName);
|
||||||
if (!aliasee) {
|
if (!aliasee) {
|
||||||
// FIXME: This isn't unsupported, this is just an error, which
|
// FIXME: This isn't unsupported, this is just an error, which
|
||||||
// sema should catch, but...
|
// sema should catch, but...
|
||||||
|
@ -539,16 +539,14 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenModule::EmitGlobal(const ValueDecl *Global) {
|
void CodeGenModule::EmitGlobal(const ValueDecl *Global) {
|
||||||
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
|
|
||||||
// Aliases are deferred until code for everything else has been
|
// Aliases are deferred until code for everything else has been
|
||||||
// emitted.
|
// emitted.
|
||||||
if (FD->getAttr<AliasAttr>()) {
|
if (Global->getAttr<AliasAttr>()) {
|
||||||
assert(!FD->isThisDeclarationADefinition() &&
|
Aliases.push_back(Global);
|
||||||
"Function alias cannot have a definition!");
|
|
||||||
Aliases.push_back(FD);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
|
||||||
// Forward declarations are emitted lazily on first use.
|
// Forward declarations are emitted lazily on first use.
|
||||||
if (!FD->isThisDeclarationADefinition())
|
if (!FD->isThisDeclarationADefinition())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -109,7 +109,7 @@ class CodeGenModule : public BlockModule {
|
||||||
/// Aliases - List of aliases in module. These cannot be emitted until all the
|
/// Aliases - List of aliases in module. These cannot be emitted until all the
|
||||||
/// code has been seen, as they reference things by name instead of directly
|
/// code has been seen, as they reference things by name instead of directly
|
||||||
/// and may reference forward.
|
/// and may reference forward.
|
||||||
std::vector<const FunctionDecl*> Aliases;
|
std::vector<const ValueDecl*> Aliases;
|
||||||
|
|
||||||
/// DeferredDecls - List of decls for which code generation has been
|
/// DeferredDecls - List of decls for which code generation has been
|
||||||
/// deferred. When the translation unit has been fully processed we
|
/// deferred. When the translation unit has been fully processed we
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
// RUN: clang -triple i386-pc-linux-gnu -emit-llvm -o %t %s &&
|
||||||
|
// 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
|
||||||
|
|
||||||
|
void f0(void) { }
|
||||||
|
extern void f1(void);
|
||||||
|
extern void f1(void) __attribute((alias("f0")));
|
||||||
|
|
||||||
|
int g0;
|
||||||
|
extern int g1;
|
||||||
|
extern int g1 __attribute((alias("g0")));
|
Loading…
Reference in New Issue