Hi,

   Could a gatekeepler please help review the patch for fix bug908
https://bugs.open64.net/show_bug.cgi?id=908?

A cutdown bugcase:

typedef unsigned int __u32;
typedef unsigned long long __u64;
typedef unsigned char __u8;
struct in_core_key {
    __u32 k_dir_id;             /* packing locality: by default parent
                                   directory object id */
    __u32 k_objectid;   /* object identifier */
    __u64 k_offset;
    __u8 k_type;
  };
typedef unsigned long sector_t;
typedef __u32 b_blocknr_t;
struct tree_balance {
 struct in_core_key key;
};
struct __reiserfs_blocknr_hint {
  void* inode;
  void *path;
  struct in_core_key key;
  sector_t block;
  void *th;
  b_blocknr_t beg, end;
  b_blocknr_t search_start;
  int prealloc_size;
  unsigned formatted_node:1;
  unsigned preallocate:1;
};
typedef struct __reiserfs_blocknr_hint reiserfs_blocknr_hint_t;
extern void foo(reiserfs_blocknr_hint_t* t);
struct tree_balance *p;
void reiserfs_new_form_blocknrs(void)
{
   reiserfs_blocknr_hint_t hint = {
          .key = p->key,
          .formatted_node = 1
   };
  foo(&hint);
}

compiler assert:

 opencc -S bug908-2.c
### Assertion failure at line 5197 of
/fc/proj/ctires/open64/o64guru/src/Wed/trunk/osprey/be/com/wn_lower.cxx:
### Compiler Error in file bug908-2.c during Global Optimization -- Mainopt
Lowering phase:
### non-bit-field associated with bit-field access for  OPR_STID
opencc INTERNAL ERROR:
/fc/proj/ctires/open64/o64guru/OPEN64_X86_DBG/LATEST/bits//lib/gcc-lib/x86_64-open64-linux/5.0/be
returned non-zero status 1
Analysis:

  When we dump the wgen generated .B file , we get:
...
  U4INTCONST 1 (0x1)
 BSSTID 0 <2,1,hint> T<53,__reiserfs_blocknr_hint,8> <field_id:10> {line:
1/37}
 U4INTCONST 0 (0x0)
 BSSTID 0 <2,1,hint> T<53,__reiserfs_blocknr_hint,8> <field_id:11> {line:
1/37}
...

this is already wrong, formatted_node and preallocate should be field_id 13
and 14, so we can make sure wgen does something unexpected.

examine the source code, we find when wgen iterates the fields of a STRUCT
structure in function AGGINIT::Traverse_Aggregate_Struct , it increase the
field_id by one when field comes to the next, so when a STRUCT field is
initialized, the field_id is not rightly increased as to correspond current
field.

Suggested patch:

 index 8b37860..37c0ba7 100644
--- a/osprey/wgen/wgen_decl.cxx
+++ b/osprey/wgen/wgen_decl.cxx
@@ -3443,6 +3443,16 @@ AGGINIT::Traverse_Aggregate_Struct (
 #endif
                                 is_bit_field, field_id, fld,
emitted_bytes);
         // emitted_bytes updated by the call as reference parameter
+
+        // bug908 open64.net. update field_id for the case of field is
struct type.
+        if (TY_kind(fld_ty) == KIND_STRUCT) {
+          FLD_HANDLE field;
+          field = TY_fld(fld_ty); // get first field
+          while (!field.Is_Null()) {
+            field_id=Advance_Field_Id(field,field_id);
+            field=FLD_next(field);
+          }
+        }
       }
     }
could a gatekeeper help a review? thanks


Regards
Gang
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure 
contains a definitive record of customers, application performance, 
security threats, fraudulent activity, and more. Splunk takes this 
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to