From: Reid Kleckner Date: Thu, 13 Feb 2014 02:18:36 +0000 (+0000) Subject: GlobalOpt: Aliases don't have sections, don't copy them when replacing X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2798b77586abff91dca088cd678dd9fc0c6da3cd;p=oota-llvm.git GlobalOpt: Aliases don't have sections, don't copy them when replacing As defined in LangRef, aliases do not have sections. However, LLVM's GlobalAlias class inherits from GlobalValue, which means we can read and set its section. We should probably ban that as a separate change, since it doesn't make much sense for an alias to have a section that differs from its aliasee. Fixes PR18757, where the section was being lost on the global in code from Clang like: extern "C" { __attribute__((used, section("CUSTOM"))) static int in_custom_section; } Reviewers: rafael.espindola Differential Revision: http://llvm-reviews.chandlerc.com/D2758 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201286 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 50113069094..0381f8c180e 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -3018,7 +3018,8 @@ bool GlobalOpt::OptimizeGlobalAliases(Module &M) { // Give the aliasee the name, linkage and other attributes of the alias. Target->takeName(J); Target->setLinkage(J->getLinkage()); - Target->GlobalValue::copyAttributesFrom(J); + Target->setVisibility(J->getVisibility()); + Target->setDLLStorageClass(J->getDLLStorageClass()); if (Used.usedErase(J)) Used.usedInsert(Target); diff --git a/test/Transforms/GlobalOpt/alias-resolve.ll b/test/Transforms/GlobalOpt/alias-resolve.ll index 32f4bf8ebe2..5e229b94268 100644 --- a/test/Transforms/GlobalOpt/alias-resolve.ll +++ b/test/Transforms/GlobalOpt/alias-resolve.ll @@ -1,7 +1,4 @@ -; We use a temporary file so that the test fails when opt crashes. - -; RUN: opt < %s -globalopt -S > %t -; RUN: FileCheck %s < %t +; RUN: opt < %s -globalopt -S | FileCheck %s @foo1 = alias void ()* @foo2 ; CHECK: @foo1 = alias void ()* @foo2 diff --git a/test/Transforms/GlobalOpt/alias-used-section.ll b/test/Transforms/GlobalOpt/alias-used-section.ll new file mode 100644 index 00000000000..987c4a4926d --- /dev/null +++ b/test/Transforms/GlobalOpt/alias-used-section.ll @@ -0,0 +1,8 @@ +; RUN: opt -S -globalopt < %s | FileCheck %s + +@_Z17in_custom_section = internal global i8 42, section "CUSTOM" +@in_custom_section = protected dllexport alias internal i8* @_Z17in_custom_section + +; CHECK: @in_custom_section = internal protected dllexport global i8 42, section "CUSTOM" + +@llvm.used = appending global [1 x i8*] [i8* @in_custom_section], section "llvm.metadata"