Răsfoiți Sursa

Merge pull request #5142 from noloader/master

Mostly fix Sun Studio configuration using SunCC compiler (GH #5141)
Joshua Haberman 6 ani în urmă
părinte
comite
81c3e0cf52

+ 4 - 1
m4/acx_check_suncc.m4

@@ -26,7 +26,7 @@ AC_DEFUN([ACX_CHECK_SUNCC],[
   AS_IF([test "$SUNCC" = "yes" -a "x${ac_cv_env_CXXFLAGS_set}" = "x"],[
     dnl Sun Studio has a crashing bug with -xO4 in some cases. Keep this
     dnl at -xO3 until a proper test to detect those crashes can be done.
-    CXXFLAGS="-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -compat=5 -library=stlport4 -library=Crun -template=no%extdef ${CXXFLAGS}"
+    CXXFLAGS="-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -template=no%extdef ${CXXFLAGS}"
   ])
 
   case $host_os in
@@ -67,4 +67,7 @@ AC_DEFUN([ACX_CHECK_SUNCC],[
     ;;
   esac
 
+  AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[
+    CXXFLAGS="-xregs=no%appl ${CXXFLAGS}"
+  ])
 ])

+ 8 - 6
src/google/protobuf/generated_message_util.cc

@@ -620,6 +620,7 @@ bool IsNull<FieldMetadata::kInlinedType>(const void* ptr) {
 void SerializeInternal(const uint8* base,
                        const FieldMetadata* field_metadata_table,
                        int32 num_fields, io::CodedOutputStream* output) {
+  SpecialSerializer func = nullptr;
   for (int i = 0; i < num_fields; i++) {
     const FieldMetadata& field_metadata = field_metadata_table[i];
     const uint8* ptr = base + field_metadata.offset;
@@ -646,9 +647,9 @@ void SerializeInternal(const uint8* base,
 
       // Special cases
       case FieldMetadata::kSpecial:
-        reinterpret_cast<SpecialSerializer>(
-            const_cast<void*>(field_metadata.ptr))(
-            base, field_metadata.offset, field_metadata.tag,
+	    func = reinterpret_cast<SpecialSerializer>(
+            const_cast<void*>(field_metadata.ptr));
+        func (base, field_metadata.offset, field_metadata.tag,
             field_metadata.has_offset, output);
         break;
       default:
@@ -664,6 +665,7 @@ uint8* SerializeInternalToArray(const uint8* base,
                                 uint8* buffer) {
   ArrayOutput array_output = {buffer, is_deterministic};
   ArrayOutput* output = &array_output;
+  SpecialSerializer func = nullptr;
   for (int i = 0; i < num_fields; i++) {
     const FieldMetadata& field_metadata = field_metadata_table[i];
     const uint8* ptr = base + field_metadata.offset;
@@ -692,9 +694,9 @@ uint8* SerializeInternalToArray(const uint8* base,
         io::ArrayOutputStream array_stream(array_output.ptr, INT_MAX);
         io::CodedOutputStream output(&array_stream);
         output.SetSerializationDeterministic(is_deterministic);
-        reinterpret_cast<SpecialSerializer>(
-            const_cast<void*>(field_metadata.ptr))(
-            base, field_metadata.offset, field_metadata.tag,
+		func =  reinterpret_cast<SpecialSerializer>(
+            const_cast<void*>(field_metadata.ptr));
+		func (base, field_metadata.offset, field_metadata.tag,
             field_metadata.has_offset, &output);
         array_output.ptr += output.ByteCount();
       } break;

+ 2 - 1
src/google/protobuf/stubs/common.cc

@@ -338,7 +338,8 @@ struct ShutdownData {
 };
 
 static void RunZeroArgFunc(const void* arg) {
-  reinterpret_cast<void (*)()>(const_cast<void*>(arg))();
+  void (*func)() = reinterpret_cast<void (*)()>(const_cast<void*>(arg));
+  func();
 }
 
 void OnShutdown(void (*func)()) {