tra added inline comments.

================
Comment at: lib/CodeGen/CodeGenModule.cpp:1235-1236
@@ -1235,8 +1234,4 @@
     // different type.
-    // FIXME: Support for variables is not implemented yet.
-    if (isa<FunctionDecl>(D.getDecl()))
-      GV = cast<llvm::GlobalValue>(GetAddrOfGlobal(D, 
/*IsForDefinition=*/true));
-    else
-      if (!GV)
-        GV = GetGlobalValue(getMangledName(D));
+    llvm::GlobalValue *GV =
+        cast<llvm::GlobalValue>(GetAddrOfGlobal(D, /*IsForDefinition=*/true));
 
----------------
andreybokhanko wrote:
> Artem, to address your concern (from http://reviews.llvm.org/rL254195#39417): 
> if IsForDefinition equals to true, it is guaranteed that we get GlobalValue 
> here. We specifically call GetAddrOfGlobal to create (or get) a global with 
> required type, not cast from a declaration with a different type.
Empirical evidence suggests that it's possible to get non GlobalValue from 
GetAddrOfGlobal.
For instance, you may get llvm::UnaryConstantExpr which would be the case when 
GetAddrOfGlobal returns an addrspacecast which may happen during CUDA or OpenCL 
compilation.

If you want to reproduce the problem, apply my pending patch 
http://reviews.llvm.org/D15305 which has to defer emitting some variables. Run 
clang tests and you will see a lot of CUDA test cases crashing with assertion 
on this cast.



http://reviews.llvm.org/D15686



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to