Implement extern block var.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47223 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 24e9291..879f29a 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -336,9 +336,14 @@
 LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
   const ValueDecl *D = E->getDecl();
   if (isa<BlockVarDecl>(D) || isa<ParmVarDecl>(D)) {
-    llvm::Value *V = LocalDeclMap[D];
-    assert(V && "BlockVarDecl not entered in LocalDeclMap?");
-    return LValue::MakeAddr(V);
+    const VarDecl *VD = cast<VarDecl>(D);
+    if (VD->getStorageClass() == VarDecl::Extern)
+      return LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD, false));
+    else {
+      llvm::Value *V = LocalDeclMap[D];
+      assert(V && "BlockVarDecl not entered in LocalDeclMap?");
+      return LValue::MakeAddr(V);
+    }
   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
     return LValue::MakeAddr(CGM.GetAddrOfFunctionDecl(FD, false));
   } else if (const FileVarDecl *FVD = dyn_cast<FileVarDecl>(D)) {