]> granicus.if.org Git - clang/commitdiff
Implement extern block var.
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Sat, 16 Feb 2008 22:30:38 +0000 (22:30 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Sat, 16 Feb 2008 22:30:38 +0000 (22:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47223 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGDecl.cpp
CodeGen/CGExpr.cpp
test/CodeGen/extern-block-var.c [new file with mode: 0644]

index d8e8f4e1ca2f5d01d992ea664be1a047c7114634..cd31fa7a7d3c8dac97b746222a795945ec899a3f 100644 (file)
@@ -54,7 +54,8 @@ void CodeGenFunction::EmitBlockVarDecl(const BlockVarDecl &D) {
   case VarDecl::Static:
     return EmitStaticBlockVarDecl(D);
   case VarDecl::Extern:
-    assert(0 && "FIXME: should call up to codegenmodule");
+    // Don't emit it now, allow it to be emitted lazily on its first use.
+    return;
   default:
     assert((D.getStorageClass() == VarDecl::None ||
             D.getStorageClass() == VarDecl::Auto ||
index 24e929188b43a606a9b558ed36a50372fb0d5c61..879f29ab60ab664efa449893d7ca0ec7656e9281 100644 (file)
@@ -336,9 +336,14 @@ void CodeGenFunction::EmitStoreThroughOCUComponentLValue(RValue Src, LValue Dst,
 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)) {
diff --git a/test/CodeGen/extern-block-var.c b/test/CodeGen/extern-block-var.c
new file mode 100644 (file)
index 0000000..ea8df7b
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: clang %s -emit-llvm
+
+int f() {
+  extern int a;
+  return a;
+}