r211570 - AST: Address of dllimport functions isn't constant

David Majnemer david.majnemer at gmail.com
Mon Jun 23 23:40:52 PDT 2014


Author: majnemer
Date: Tue Jun 24 01:40:51 2014
New Revision: 211570

URL: http://llvm.org/viewvc/llvm-project?rev=211570&view=rev
Log:
AST: Address of dllimport functions isn't constant

The address of dllimport functions can be accessed one of two ways:
- Through the IAT which is symbolically referred to with a symbol
  starting with __imp_.
- Via the wrapper-function which ends up calling through the __imp_
  symbol.

The problem with using the wrapper-function is that it's address will
not compare as equal in all translation units.  Specifically, it will
compare unequally with the translation unit which defines the function.

This fixes PR19955.

Modified:
    cfe/trunk/lib/AST/ExprConstant.cpp
    cfe/trunk/test/CodeGenCXX/PR19955.cpp
    cfe/trunk/test/SemaCXX/PR19955.cpp

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=211570&r1=211569&r2=211570&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Tue Jun 24 01:40:51 2014
@@ -4373,8 +4373,11 @@ static bool EvaluateLValue(const Expr *E
 }
 
 bool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
-  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl()))
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
+    if (FD->hasAttr<DLLImportAttr>())
+      return ZeroInitialization(E);
     return Success(FD);
+  }
   if (const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()))
     return VisitVarDecl(E, VD);
   return Error(E);

Modified: cfe/trunk/test/CodeGenCXX/PR19955.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/PR19955.cpp?rev=211570&r1=211569&r2=211570&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/PR19955.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/PR19955.cpp Tue Jun 24 01:40:51 2014
@@ -1,10 +1,27 @@
 // RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck %s --check-prefix X64
 
-extern int __declspec(dllimport) x;
-extern long long y;
-// CHECK-DAG: @"\01?y@@3_JA" = global i64 0
-long long y = (long long)&x;
+extern int __declspec(dllimport) var;
+extern void __declspec(dllimport) fun();
 
-// CHECK-LABEL: @"\01??__Ey@@YAXXZ"
-// CHECK-DAG: @"\01?y@@3_JA"
+extern int *varp;
+int *varp = &var;
+// CHECK-DAG: @"\01?varp@@3PAHA" = global i32* null
+// X64-DAG: @"\01?varp@@3PEAHEA" = global i32* null
+
+extern void (*funp)();
+void (*funp)() = &fun;
+// CHECK-DAG: @"\01?funp@@3P6AXXZA" = global void ()* null
+// X64-DAG: @"\01?funp@@3P6AXXZEA" = global void ()* null
+
+// CHECK-LABEL: @"\01??__Evarp@@YAXXZ"
+// CHECK-DAG: store i32* @"\01?var@@3HA", i32** @"\01?varp@@3PAHA"
+
+// X64-LABEL: @"\01??__Evarp@@YAXXZ"
+// X64-DAG: store i32* @"\01?var@@3HA", i32** @"\01?varp@@3PEAHEA"
+
+// CHECK-LABEL: @"\01??__Efunp@@YAXXZ"()
+// CHECK-DAG: store void ()* @"\01?fun@@YAXXZ", void ()** @"\01?funp@@3P6AXXZA"
+
+// X64-LABEL: @"\01??__Efunp@@YAXXZ"()
+// X64-DAG: store void ()* @"\01?fun@@YAXXZ", void ()** @"\01?funp@@3P6AXXZEA"

Modified: cfe/trunk/test/SemaCXX/PR19955.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/PR19955.cpp?rev=211570&r1=211569&r2=211570&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/PR19955.cpp (original)
+++ cfe/trunk/test/SemaCXX/PR19955.cpp Tue Jun 24 01:40:51 2014
@@ -1,4 +1,7 @@
 // RUN: %clang_cc1 -triple i686-win32 -verify -std=c++11 %s
 
-extern int __attribute__((dllimport)) y;
-constexpr int *x = &y; // expected-error {{must be initialized by a constant expression}}
+extern int __attribute__((dllimport)) var;
+constexpr int *varp = &var; // expected-error {{must be initialized by a constant expression}}
+
+extern __attribute__((dllimport)) void fun();
+constexpr void (*funp)(void) = &fun; // expected-error {{must be initialized by a constant expression}}





More information about the cfe-commits mailing list