This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: libgcj/25187 - Fix type-punned pointer deferences and other warnings


This patch fixes a bunch of remaining warnings that occur during the libjava build (mostly "dereferencing type-punned pointer will break strict-aliasing rules"). With this patch, libjava now builds without any (C++) warnings on x86_64 linux.

Bryce

2006-02-08  Bryce McKinlay  <mckinlay@redhat.com>

	PR libgcj/25187:
	* gnu/gcj/io/natSimpleSHSStream.cc
	(gnu::gcj::io::SimpleSHSStream::shsFinal): Remove bogus cast.
	* interpret.cc (_Jv_InterpMethod::run): Simplify arguments to
	_Jv_InterpFrame(). 
	* boehm.cc: #undef some autoconf macros before including gc-config.h.
	(_Jv_MarkObject): Don't mark the class, it is reachable via the vtable.
	(_Jv_MarkArray): Likewise.
	* java/lang/ref/natReference.cc (java::lang::ref::Reference::create):
	Simplify _Jv_GCRegisterDisappearingLink() call.
	* java/lang/Class.h (getComponentType): Use element_type.
	(element_type): New field declaration, as a union with "methods".
	* java/lang/natClassLoader.cc (_Jv_NewArrayClass): Use "element_type".
	* java/net/natVMNetworkInterfacePosix.cc
	(java::net::VMNetworkInterface::getInterfaces): Add "int" cast to
	avoid sign comparison warning.	
	* include/java-interp.h (_Jv_InterpFrame): Take thread as second
	argument, not parent call frame.
	* include/x86_64-signal.h (MAKE_THROW_FRAME): Use "gregs" directly,
	without a cast.
	(restore_rt): Declare with hidden visibility, not "static".
	* posix.cc (_Jv_platform_initProperties): Make "tmpdir" a string
	constant.
	* jni.cc (_Jv_JNI_DestroyJavaVM): Use a union to avoid strict alias
	warning.

Index: gnu/gcj/io/natSimpleSHSStream.cc
===================================================================
--- gnu/gcj/io/natSimpleSHSStream.cc	(revision 110763)
+++ gnu/gcj/io/natSimpleSHSStream.cc	(working copy)
@@ -29,7 +29,7 @@
   ::shsFinal (info);
 
   jbyteArray buffer = JvNewByteArray (SHS_DIGESTSIZE);
-  memcpy (elements (buffer), (jbyte *)&info->digest, SHS_DIGESTSIZE);
+  memcpy (elements (buffer), &info->digest, SHS_DIGESTSIZE);
   return buffer;
 }
     
Index: interpret.cc
===================================================================
--- interpret.cc	(revision 110767)
+++ interpret.cc	(working copy)
@@ -807,8 +807,7 @@
   // destructor so it cleans up automatically when the interpreter
   // returns.
   java::lang::Thread *thread = java::lang::Thread::currentThread();
-  _Jv_InterpFrame frame_desc (meth,
-			      (_Jv_InterpFrame **) &thread->interp_frame);
+  _Jv_InterpFrame frame_desc (meth, thread);
 
   _Jv_word stack[meth->max_stack];
   _Jv_word *sp = stack;
Index: boehm.cc
===================================================================
--- boehm.cc	(revision 110763)
+++ boehm.cc	(working copy)
@@ -26,6 +26,12 @@
 #undef TRUE
 #undef FALSE
 
+// We include two autoconf headers. Avoid multiple definition warnings.
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+
 extern "C"
 {
 #include <gc_config.h>
@@ -93,9 +99,6 @@
     p = (GC_PTR) obj->sync_info;
     MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj);
 # endif
-  // Mark the object's class.
-  p = (GC_PTR) klass;
-  MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj);
 
   if (__builtin_expect (klass == &java::lang::Class::class$, false))
     {
@@ -208,7 +211,6 @@
   // we may need to round up the size.
   if (__builtin_expect (! dt || !(dt -> get_finalizer()), false))
     return mark_stack_ptr;
-  jclass klass = dt->clas;
   GC_PTR p;
 
   p = (GC_PTR) dt;
@@ -219,9 +221,6 @@
     p = (GC_PTR) array->sync_info;
     MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, array);
 # endif
-  // Mark the object's class.
-  p = (GC_PTR) klass;
-  MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, &(dt -> clas));
 
   for (int i = 0; i < JvGetArrayLength (array); ++i)
     {
Index: java/lang/natClassLoader.cc
===================================================================
--- java/lang/natClassLoader.cc	(revision 110763)
+++ java/lang/natClassLoader.cc	(working copy)
@@ -458,7 +458,7 @@
     = java::lang::Object::class$.vtable_method_count;
 
   // Stash the pointer to the element type.
-  array_class->methods = (_Jv_Method *) element;
+  array_class->element_type = element;
 
   // Register our interfaces.
   static jclass interfaces[] =
Index: java/lang/ref/natReference.cc
===================================================================
--- java/lang/ref/natReference.cc	(revision 110763)
+++ java/lang/ref/natReference.cc	(working copy)
@@ -363,8 +363,8 @@
       // finalizer for ourselves as well.
       _Jv_RegisterFinalizer (this, finalize_reference);
       _Jv_RegisterFinalizer (referent, finalize_referred_to_object);
-      jobject *objp = reinterpret_cast<jobject *> (&referent);
-      _Jv_GCRegisterDisappearingLink (objp);
+      gnu::gcj::RawData **p = &referent;
+     _Jv_GCRegisterDisappearingLink ((jobject *) p);
       add_to_hash (this);
     }
 }
Index: java/lang/Class.h
===================================================================
--- java/lang/Class.h	(revision 110767)
+++ java/lang/Class.h	(working copy)
@@ -368,7 +368,7 @@
 
   inline jclass getComponentType (void)
     {
-      return isArray () ? (* (jclass *) &methods) : 0;
+      return isArray () ? element_type : 0;
     }
 
   jboolean isAssignableFrom (jclass cls);
@@ -554,7 +554,11 @@
   _Jv_Constants constants;
   // Methods.  If this is an array class, then this field holds a
   // pointer to the element type.
-  _Jv_Method *methods;
+  union
+  {
+    _Jv_Method *methods;
+    jclass element_type;
+  };
   // Number of methods.  If this class is primitive, this holds the
   // character used to represent this type in a signature.
   jshort method_count;
Index: java/net/natVMNetworkInterfacePosix.cc
===================================================================
--- java/net/natVMNetworkInterfacePosix.cc	(revision 110763)
+++ java/net/natVMNetworkInterfacePosix.cc	(working copy)
@@ -75,7 +75,7 @@
       if (::ioctl (fd, SIOCGIFCONF, &if_data) < 0)
         throw new java::net::SocketException;
     }
-  while (if_data.ifc_len >= (sizeof (struct ifreq) * num_interfaces));
+  while (if_data.ifc_len >= (int) (sizeof (struct ifreq) * num_interfaces));
 
   // Get addresses of all interfaces.
   if_record = if_data.ifc_req;
Index: include/java-interp.h
===================================================================
--- include/java-interp.h	(revision 110763)
+++ include/java-interp.h	(working copy)
@@ -22,6 +22,8 @@
 #include <java/lang/Class.h>
 #include <java/lang/ClassLoader.h>
 #include <java/lang/reflect/Modifier.h>
+#include <java/lang/Thread.h>
+#include <gnu/gcj/RawData.h>
 
 // Define this to get the direct-threaded interpreter.  If undefined,
 // we revert to a basic bytecode interpreter.  The former is faster
@@ -290,22 +292,22 @@
 struct _Jv_InterpFrame
 {
   _Jv_InterpMethod *self;
-  _Jv_InterpFrame **ptr;
+  java::lang::Thread *thread;
   _Jv_InterpFrame *next;
   pc_t pc;
 
-  _Jv_InterpFrame (_Jv_InterpMethod *s, _Jv_InterpFrame **n)
+  _Jv_InterpFrame (_Jv_InterpMethod *s, java::lang::Thread *thr)
   {
     self = s;
-    ptr = n;
-    next = *n;
-    *n = this;
+    thread = thr;
+    next = (_Jv_InterpFrame *) thr->interp_frame;
+    thr->interp_frame = (gnu::gcj::RawData *) this;
     pc = NULL;
   }
 
   ~_Jv_InterpFrame ()
   {
-    *ptr = next;
+    thread->interp_frame = (gnu::gcj::RawData *) next;
   }
 };
 
Index: include/x86_64-signal.h
===================================================================
--- include/x86_64-signal.h	(revision 110763)
+++ include/x86_64-signal.h	(working copy)
@@ -41,8 +41,7 @@
      instruction:  the x86_64 exception handler expects			     \
      the PC to point to the instruction after a call. */		     \
   struct ucontext *_uc = (struct ucontext *)_p;				     \
-  volatile struct sigcontext *_sc = (struct sigcontext *) &_uc->uc_mcontext; \
-  _sc->rip += 2;							     \
+  _uc->uc_mcontext.gregs[REG_RIP] += 2;				     	     \
 }									     \
 while (0)
 
@@ -60,7 +59,8 @@
 
 /* The return code for realtime-signals.  */
 RESTORE (restore_rt, __NR_rt_sigreturn)
-static void restore_rt (void) asm ("__restore_rt");
+void restore_rt (void) asm ("__restore_rt")
+  __attribute__ ((visibility ("hidden")));
 
 #define INIT_SEGV						\
 do								\
Index: posix.cc
===================================================================
--- posix.cc	(revision 110763)
+++ posix.cc	(working copy)
@@ -98,7 +98,7 @@
   SET ("file.separator", "/");
   SET ("path.separator", ":");
   SET ("line.separator", "\n");
-  char *tmpdir = ::getenv("TMPDIR");
+  const char *tmpdir = ::getenv("TMPDIR");
   if (! tmpdir)
     tmpdir = "/tmp";
   SET ("java.io.tmpdir", tmpdir);
Index: jni.cc
===================================================================
--- jni.cc	(revision 110763)
+++ jni.cc	(working copy)
@@ -2426,7 +2426,12 @@
 {
   JvAssert (the_vm && vm == the_vm);
 
-  JNIEnv *env;
+  union
+  {
+    JNIEnv *env;
+    void *env_p;
+  };
+
   if (_Jv_ThreadCurrent () != NULL)
     {
       jstring main_name;
@@ -2440,8 +2445,7 @@
 	  return JNI_ERR;
 	}
 
-      jint r = _Jv_JNI_AttachCurrentThread (vm, main_name,
-					    reinterpret_cast<void **> (&env),
+      jint r = _Jv_JNI_AttachCurrentThread (vm, main_name, &env_p,
 					    NULL, false);
       if (r < 0)
 	return r;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]