]> granicus.if.org Git - clang/commitdiff
Targets that don't have stack use global address space for parameters.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Tue, 3 Feb 2009 18:07:49 +0000 (18:07 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Tue, 3 Feb 2009 18:07:49 +0000 (18:07 +0000)
Specify external linkage for such globals so that llvm optimizer do
not assume there values initialized as zero.

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

lib/CodeGen/CGDecl.cpp
lib/CodeGen/CodeGenFunction.h

index 6774f33337ae34d7e809edb9294efdd4f7db818f..898c1bfd80db39210f9796442a557de70389af7e 100644 (file)
@@ -77,7 +77,9 @@ void CodeGenFunction::EmitBlockVarDecl(const VarDecl &D) {
 llvm::GlobalValue *
 CodeGenFunction::GenerateStaticBlockVarDecl(const VarDecl &D,
                                             bool NoInit,
-                                            const char *Separator) {
+                                            const char *Separator,
+                                            llvm::GlobalValue
+                                               ::LinkageTypes Linkage) {
   QualType Ty = D.getType();
   assert(Ty->isConstantSizeType() && "VLAs can't be static");
   
@@ -108,7 +110,7 @@ CodeGenFunction::GenerateStaticBlockVarDecl(const VarDecl &D,
 
   llvm::GlobalValue *GV =
     new llvm::GlobalVariable(Init->getType(), false,
-                             llvm::GlobalValue::InternalLinkage,
+                             Linkage,
                              Init, ContextName + Separator +D.getNameAsString(),
                              &CGM.getModule(), 0, Ty.getAddressSpace());
 
@@ -120,7 +122,9 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D) {
   llvm::Value *&DMEntry = LocalDeclMap[&D];
   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
   
-  llvm::GlobalValue *GV = GenerateStaticBlockVarDecl(D, false, ".");
+  llvm::GlobalValue *GV;
+  GV = GenerateStaticBlockVarDecl(D, false, ".",
+                                  llvm::GlobalValue::InternalLinkage);
 
   if (const AnnotateAttr *AA = D.getAttr<AnnotateAttr>()) {
     SourceManager &SM = CGM.getContext().getSourceManager();
@@ -166,7 +170,9 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) {
       // Targets that don't support recursion emit locals as globals.
       const char *Class =
         D.getStorageClass() == VarDecl::Register ? ".reg." : ".auto.";
-      DeclPtr = GenerateStaticBlockVarDecl(D, true, Class);
+      DeclPtr = GenerateStaticBlockVarDecl(D, true, Class, 
+                                           llvm::GlobalValue
+                                           ::InternalLinkage);
     }
     
     if (Ty->isVariablyModifiedType())
@@ -232,7 +238,11 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
     // Variable sized values always are passed by-reference.
     DeclPtr = Arg;
   } else if (Target.useGlobalsForAutomaticVariables()) {
-    DeclPtr = GenerateStaticBlockVarDecl(D, true, ".arg.");
+    // Targets that don't have stack use global address space for parameters.
+    // Specify external linkage for such globals so that llvm optimizer do
+    // not assume there values initialized as zero.
+    DeclPtr = GenerateStaticBlockVarDecl(D, true, ".arg.",
+                                         llvm::GlobalValue::ExternalLinkage);
   } else {
     // A fixed sized single-value variable becomes an alloca in the entry block.
     const llvm::Type *LTy = ConvertType(Ty);
index 1605e2a31def6f6f0e68b3a393660e69097a318d..31b2c4e4e4081c0a085f2e30885f59657fb1acf6 100644 (file)
@@ -627,9 +627,11 @@ public:
 
   /// GenerateStaticBlockVarDecl - return the the static
   /// declaration of local variable. 
-  llvm::GlobalValue *GenerateStaticBlockVarDecl(const VarDecl &D,
-                                                bool NoInit,
-                                                const char *Separator);
+  llvm::GlobalValue * GenerateStaticBlockVarDecl(const VarDecl &D,
+                                                 bool NoInit,
+                                                 const char *Separator,
+                                                 llvm::GlobalValue
+                                                 ::LinkageTypes Linkage);
 
   // GenerateStaticCXXBlockVarDecl - return the static declaration of
   // a local variable. Performs initialization of the variable if necessary.