From: Ulrich Weigand Date: Tue, 21 Apr 2015 17:27:59 +0000 (+0000) Subject: Provide alignment info on LLVM external symbols X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8c5754967d252eaea1fa7b9597ca85923b54962;p=clang Provide alignment info on LLVM external symbols Code in CodeGenModule::GetOrCreateLLVMGlobal that sets up GlobalValue object for LLVM external symbols has this comment: // FIXME: This code is overly simple and should be merged with other global // handling. One part does seems to be "overly simple" currently is that this code never sets any alignment info on the GlobalValue, so that the emitted IR does not have any align attribute on external globals. This can lead to unnecessarily inefficient code generation. This patch adds a GV->setAlignment call to set alignment info. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235396 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 17b7ddc768..b30885d4cd 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1777,6 +1777,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, // handling. GV->setConstant(isTypeConstant(D->getType(), false)); + GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); + setLinkageAndVisibilityForGV(GV, D); if (D->getTLSKind()) { diff --git a/test/CodeGen/align-systemz.c b/test/CodeGen/align-systemz.c index 277492c060..68a21e39ab 100644 --- a/test/CodeGen/align-systemz.c +++ b/test/CodeGen/align-systemz.c @@ -12,3 +12,16 @@ char c; struct test s; // CHECK-DAG: @s = common global %struct.test zeroinitializer, align 2 +extern char ec; +// CHECK-DAG: @ec = external global i8, align 2 + +extern struct test es; +// CHECK-DAG: @es = external global %struct.test, align 2 + +// Dummy function to make sure external symbols are used. +void func (void) +{ + c = ec; + s = es; +} +