delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin-apps/2001/05/17/06:00:18

Mailing-List: contact cygwin-apps-help AT sourceware DOT cygnus DOT com; run by ezmlm
Sender: cygwin-apps-owner AT sourceware DOT cygnus DOT com
List-Subscribe: <mailto:cygwin-apps-subscribe AT sources DOT redhat DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin-apps/>
List-Post: <mailto:cygwin-apps AT sources DOT redhat DOT com>
List-Help: <mailto:cygwin-apps-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/lists.html#faqs>
Delivered-To: mailing list cygwin-apps AT sources DOT redhat DOT com
Message-ID: <20010517100006.21057.qmail@web6405.mail.yahoo.com>
Date: Thu, 17 May 2001 20:00:06 +1000 (EST)
From: =?iso-8859-1?q?Danny=20Smith?= <danny_r_smith_2001 AT yahoo DOT co DOT nz>
Subject: [PATCH] Don't use context to mark initialised variables as dllimport
To: cygwin-apps <cygwin-apps AT cygwin DOT com>
MIME-Version: 1.0

This is a  patch to gcc-2.95.3-4 (cygwin special).
 
Static constant initialisation of data in C++ classes works when
linking
statically, but not with dllimported classes. 

The following code is used to build dll:

dllclass.h
======================================
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

class DLLIMPORT 
DllClass {
public:
  DllClass(); 
  unsigned int a_method () const;
  static int non_const_int;	/* initialised in dllclass.cc */
  static const unsigned int const_int=256;
  char buffer[const_int];  
};
==========================================

dllclass.cc
===========================================
#include "dllclass.h"
#include <string.h>
DllClass::DllClass(){
  memset(buffer,0,const_int); 
}

unsigned int 
DllClass::a_method () const { 
  return const_int;
}
int
DllClass::non_const_int;

============================================

Dll build correctly.
non_const_int is exported as DATA.
const_int is not exported. That's fine.

This is client code:
usedll.cc
=========================================
#include <stdio.h>
#include "dllclass.h"

int main () {
  DllClass A;
  printf("a_method = %d\n", A.a_method());
}
==========================================

This fails to compile with error:
dllclass.h:13: initialized variable `const int DllClass::const_int' is
marked dllimport.

This error is emitted by i386_pe_mark_dllimport(), not long after
i386_pe_dllimport_p() automatically puts the dllimport there in the
first place.


In this case, (integral const), one workaround is the enum hack.
-  static const unsigned int const_int=256;
+  enum {const_int=256};


The problem occurs because class members get the dllimport status
of their class, without first checking if they are initialised inline
(eg as for  static consts).

The following  patch to gcc/config/i386/winnt.c fixes the problem.
I have tested with STLport, which uses static const initialisation of
fmtflags (in ios_base) and locale categories and elsewhere.


ChangeLog

2001-05-17  Danny Smith  <danny_r_smith_2001 AT yahoo DOT com DOT nz

	* gcc/config/i386/winnt.c (i386_pe_dllimport_p): Don't use 
	context to mark initialised variables as dllimport.


--- gcc/config/i386/winnt.c.orig	Wed Jan 19 19:30:10 2000
+++ gcc/config/i386/winnt.c	Tue Mar 27 22:03:47 2001
@@ -250,6 +250,11 @@ i386_pe_dllimport_p (decl)
   context = associated_type (decl);
   if (context)
     {
+    /* Don't use context to mark initialised variables as dllimport */
+      if (TREE_CODE (decl) == VAR_DECL
+        && (DECL_INITIAL (decl)
+          && ! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))))  
+        return 0;
       imp = lookup_attribute ("dllimport",
 			      TYPE_ATTRIBUTES (context));
       if (imp)

Danny



_____________________________________________________________________________
http://messenger.yahoo.com.au - Yahoo! Messenger
- Voice chat, mail alerts, stock quotes and favourite news and lots more!

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019