A sample case:

typedef unsigned short __u16;
typedef unsigned char __u8;
typedef unsigned int __u32;
typedef unsigned long kernel_ulong_t;
struct pcmcia_device_id {
 __u16 match_flags;
 __u16 manf_id;
 __u16 card_id;
 __u8 func_id;
 __u8 function;
 __u8 device_no;
 __u32 prod_id_hash[4]
  __attribute__((aligned(sizeof(__u32))));
 const char * prod_id[4];
 kernel_ulong_t driver_info;
 char * cisfile;
};
static struct pcmcia_device_id btuart_ids[5] ;
extern const struct pcmcia_device_id __mod_pcmcia_device_table
__attribute__ ((unused, alias("btuart_ids")));
there are no functions defined in this file, without the patch, when
iterate the syms in BSS section, the condition
8264                if (ST_class(sym) == CLASS_VAR &&
 8265                    ST_base_idx(sym) != ST_st_idx(sym) &&
 8266                    !ST_is_equivalenced(sym) &&
 8267                    ST_class(ST_base(sym)) != CLASS_BLOCK &&
8268                    pu != NULL && ! PU_ftn_lang(*pu) /* bug 13585 */)
8269                  goto skip_definition

could be satisfied, so the aliased symbol not ignored and be wrongly
emitted in the bss section, and later the alias symbol be emitted as alias
again, which cause the assembler assert.



Regards
Gang


On Mon, Nov 28, 2011 at 11:10 AM, Jian-Xin Lai <laij...@gmail.com> wrote:

> Could you please explain more about the changes in cgemit.cxx? Thank
> you very much.
>
> 2011/11/25 Gang Yu <yugang...@gmail.com>:
> > Hi,
> >
> >    Could a gatekeeper please help review the fix for bug924?
> > https://bugs.open64.net/show_bug.cgi?id=924
> >
> > This is a kernel build bug, the cut-down bug case below:
> >
> > typedef unsigned int __u32;
> > typedef unsigned long kernel_ulong_t;
> > struct pci_device_id {
> >  __u32 vendor, device;
> >  __u32 subvendor, subdevice;
> >  __u32 class, class_mask;
> >  kernel_ulong_t driver_data;
> > };
> > static struct pci_device_id flexcop_pci_tbl[] = {
> >  { .vendor = (0x13d0), .device = (0x2103), .subvendor = (~0), .subdevice
> =
> > (~0) },
> >  { },
> > };
> > extern const struct pci_device_id __mod_pci_device_table __attribute__
> > ((unused, alias("flexcop_pci_tbl")));
> > wgen asserts,
> > ### Compiler Error during Writing WHIRL file phase:
> > ### Invalid Storage class (COMMON) for ST Flag: (ST_INITIALIZED)
> >
> > If provided with the option -fno-common,
> > ### Invalid Storage class (UGLOBAL) for ST Flag: (ST_INITIALIZED)
> >
> > Analysis:
> >  current wgen does not handle the common kernel code pattern (base local,
> > aliased extern const) correctly.
> >
> > Suggested patch(comments embedded in code):
> >
> > osprey/be/cg/cgemit.cxx    -- 0edf22d..ea2660c 100644
> > --- a/osprey/be/cg/cgemit.cxx
> > +++ b/osprey/be/cg/cgemit.cxx
> > @@ -8265,7 +8265,9 @@ Process_Bss_Data (SYMTAB_IDX stab)
> >                     ST_base_idx(sym) != ST_st_idx(sym) &&
> >                     !ST_is_equivalenced(sym) &&
> >                     ST_class(ST_base(sym)) != CLASS_BLOCK &&
> > -                    pu != NULL && ! PU_ftn_lang(*pu) /* bug 13585 */)
> > +                    // originally bug 13585. bug 924 open64.net.
> > +                    // no pu case should also be considered.
> > +                    ((!pu) || !PU_ftn_lang (*pu)))
> >                   goto skip_definition;
> >  #endif
> >                 size = TY_size(ST_type(sym));
> > osprey/wgen/wgen_decl.cxx    -- 8b37860..23f8143 100644
> > --- a/osprey/wgen/wgen_decl.cxx
> > +++ b/osprey/wgen/wgen_decl.cxx
> > @@ -4723,12 +4723,28 @@ WGEN_Assemble_Alias (gs_t decl, gs_t target)
> >    else {
> >      Set_ST_base_idx (st, ST_st_idx (base_st));
> >      Set_ST_emit_symbol(st);    // for cg
> > -    if (ST_is_initialized (base_st))
> > +    if (ST_is_initialized (base_st)) {
> >        Set_ST_is_initialized (st);
> > +      // bug924 open64.net. global alias symbol with base initialized
> > +      // should set storage class SCLASS_DGLOBAL.
> > +      if (ST_sclass(st) == SCLASS_COMMON || ST_sclass(st) ==
> > SCLASS_UGLOBAL)
> > +        Set_ST_sclass (st, SCLASS_DGLOBAL);
> > +    }
> >  #ifdef KEY
> > -    if (ST_init_value_zero (base_st))
> > +    if (ST_init_value_zero (base_st)) {
> >        Set_ST_init_value_zero (st);
> > +      // bug924 open64.net. Those base initialized zero
> > +      // symbols should restore to SCLASS_UGLOBAL.
> > +      if (ST_sclass(st) == SCLASS_DGLOBAL)
> > +        Set_ST_sclass (st, SCLASS_UGLOBAL);
> > +    }
> >  #endif
> > +    // bug924 open64.net aliased symbols in COMMON section should be
> > +    // set to be uninitialized. Since aliased symbols themselves
> > +    // should never be allocated.
> > +    if (ST_sclass(st) == SCLASS_COMMON) {
> > +      Set_ST_sclass (st, SCLASS_UGLOBAL);
> > +    }
> >    }
> >  #ifdef KEY
> >    if (!lang_cplus)
> >  Would a gatekeeper please 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
> >
> >
>
>
>
> --
> Regards,
> Lai Jian-Xin
>
------------------------------------------------------------------------------
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