Propagate alignment, section name and visibility when linking "appending
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 6 Jun 2007 22:01:12 +0000 (22:01 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 6 Jun 2007 22:01:12 +0000 (22:01 +0000)
global values".
Fix noinline linkage.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37482 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkModules.cpp

index cf9f777a53e2155ba7367f8e3b278e85977dd3cf..88bf62186fba1b1bdf265a3082fcd8ca4c5edfb6 100644 (file)
@@ -827,6 +827,18 @@ static bool LinkAppendingVars(Module *M,
         return Error(ErrorMsg,
                      "Appending variables linked with different const'ness!");
 
+      if (G1->getAlignment() != G2->getAlignment())
+        return Error(ErrorMsg,
+         "Appending variables with different alignment need to be linked!");
+
+      if (G1->getVisibility() != G2->getVisibility())
+        return Error(ErrorMsg,
+         "Appending variables with different visibility need to be linked!");
+
+      if (G1->getSection() != G2->getSection())
+        return Error(ErrorMsg,
+         "Appending variables with different section name need to be linked!");
+      
       unsigned NewSize = T1->getNumElements() + T2->getNumElements();
       ArrayType *NewType = ArrayType::get(T1->getElementType(), NewSize);
 
@@ -837,6 +849,9 @@ static bool LinkAppendingVars(Module *M,
         new GlobalVariable(NewType, G1->isConstant(), G1->getLinkage(),
                            /*init*/0, First->first, M, G1->isThreadLocal());
 
+      // Propagate alignment, visibility and section info.
+      CopyGVAttributes(NG, G1);
+
       // Merge the initializer...
       Inits.reserve(NewSize);
       if (ConstantArray *I = dyn_cast<ConstantArray>(G1->getInitializer())) {