]> granicus.if.org Git - clang/commitdiff
simplify some more code.
authorChris Lattner <sabre@nondot.org>
Sat, 21 Mar 2009 08:03:33 +0000 (08:03 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Mar 2009 08:03:33 +0000 (08:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67439 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h

index 91ab2b7b03e97dcb198c99c54291faa8a4657cef..38b8d36ed5169b4da7e4cfc73708445197d067c5 100644 (file)
@@ -535,11 +535,12 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
     if (FD->getAttr<ConstructorAttr>() || FD->getAttr<DestructorAttr>())
       return false;
 
+    // FIXME: What about inline, and/or extern inline?
     if (FD->getStorageClass() != FunctionDecl::Static)
       return false;
   } else {
     const VarDecl *VD = cast<VarDecl>(Global);
-    assert(VD->isFileVarDecl() && "Invalid decl.");
+    assert(VD->isFileVarDecl() && "Invalid decl");
 
     if (VD->getStorageClass() != VarDecl::Static)
       return false;
@@ -594,42 +595,46 @@ void CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) {
 
   QualType ASTTy = D->getType();
   const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
-  const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
 
   // Lookup the entry, lazily creating it if necessary.
   llvm::GlobalValue *&Entry = GlobalDeclMap[getMangledName(D)];
-  if (!Entry) {
-    llvm::GlobalVariable *GV = 
-      new llvm::GlobalVariable(Ty, false, 
-                               llvm::GlobalValue::ExternalLinkage,
-                               0, getMangledName(D), &getModule(), 
-                               0, ASTTy.getAddressSpace());
-    Entry = GV;
+  if (Entry) {
+    const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
+    
+    // Make sure the result is of the correct type.
+    if (Entry->getType() != PTy)
+      return llvm::ConstantExpr::getBitCast(Entry, PTy);
+    return Entry;
+  }
+   
+  llvm::GlobalVariable *GV = 
+    new llvm::GlobalVariable(Ty, false, 
+                             llvm::GlobalValue::ExternalLinkage,
+                             0, getMangledName(D), &getModule(), 
+                             0, ASTTy.getAddressSpace());
 
-    // Handle things which are present even on external declarations.
+  // Handle things which are present even on external declarations.
 
-    // FIXME: This code is overly simple and should be merged with
-    // other global handling.
+  // FIXME: This code is overly simple and should be merged with
+  // other global handling.
 
-    GV->setConstant(D->getType().isConstant(Context));
+  GV->setConstant(D->getType().isConstant(Context));
 
-    // FIXME: Merge with other attribute handling code.
+  // FIXME: Merge with other attribute handling code.
 
-    if (D->getStorageClass() == VarDecl::PrivateExtern)
-      setGlobalVisibility(GV, VisibilityAttr::HiddenVisibility);
+  if (D->getStorageClass() == VarDecl::PrivateExtern)
+    setGlobalVisibility(GV, VisibilityAttr::HiddenVisibility);
 
-    if (D->getAttr<WeakAttr>() || D->getAttr<WeakImportAttr>())
-      GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
+  if (D->getAttr<WeakAttr>() || D->getAttr<WeakImportAttr>())
+    GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
 
-    if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
-      // Prefaced with special LLVM marker to indicate that the name
-      // should not be munged.
-      GV->setName("\01" + ALA->getLabel());
-    }  
+  // FIXME: This should be handled by the mangler!
+  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
+    // Prefaced with special LLVM marker to indicate that the name
+    // should not be munged.
+    GV->setName("\01" + ALA->getLabel());
   }
-  
-  // Make sure the result is of the correct type.
-  return llvm::ConstantExpr::getBitCast(Entry, PTy);
+  return Entry = GV;
 }
 
 void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
@@ -826,7 +831,7 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) {
   // Lookup the entry, lazily creating it if necessary.
   llvm::GlobalValue *&Entry = GlobalDeclMap[getMangledName(D)];
   if (!Entry)
-    Entry = EmitForwardFunctionDefinition(D, 0);
+    return Entry = EmitForwardFunctionDefinition(D, 0);
 
   if (Entry->getType() != PTy)
     return llvm::ConstantExpr::getBitCast(Entry, PTy);
index a2cb442a8420e0f6f2bb14e2222dae8c125ac034..0783d6521f3bf4db0cba54511b9acf41fa10a32d 100644 (file)
@@ -86,7 +86,7 @@ class CodeGenModule : public BlockModule {
   /// protected from introducing conflicts. These globals should be
   /// created unnamed, we will name them and patch up conflicts when
   /// we release the module.
-  std::vector< std::pair<llvm::GlobalValue*, std::string> > RuntimeGlobals;
+  std::vector<std::pair<llvm::GlobalValue*, std::string> > RuntimeGlobals;
 
   /// GlobalDeclMap - Mapping of decl names (represented as unique
   /// character pointers from either the identifier table or the set