[Beignet] [PATCH] GBE: fix printf class static variable bug

Yang, Rong R rong.r.yang at intel.com
Tue Nov 10 19:03:22 PST 2015


Use the thread_local make android build hard to port. Actually, it just pass the printf pass's information to GenWrite, you could use unit for it.

> -----Original Message-----
> From: Pan, Xiuli
> Sent: Tuesday, November 10, 2015 13:30
> To: Pan, Xiuli; Song, Ruiling; beignet at lists.freedesktop.org
> Cc: Yang, Rong R
> Subject: RE: [Beignet] [PATCH] GBE: fix printf class static variable bug
> 
> Ping for pushed.
> The getAnalysis seems doesn't work for this situation. Maybe we should
> refine these passes to pass info by unit later.
> 
> Thanks
> Pan Xiuli
> 
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Pan, Xiuli
> Sent: Friday, November 6, 2015 11:27 AM
> To: Song, Ruiling <ruiling.song at intel.com>; beignet at lists.freedesktop.org
> Subject: Re: [Beignet] [PATCH] GBE: fix printf class static variable bug
> 
> Yes, but the problem is that if two thread has kernel with printf functions,
> the map<CallInst *, PrintfSet::PrintfFmt*> printfs will be cleared in
> construction and destructor. This will cause the one who is still need info in
> printfs get null pointer.
> thread_local now is to protect printfs from other thread but not pass data
> from one pass to another.
> 
> I tried the getAnalysis, but what we need the printfs as you said is in
> GenWriter and It could not be used there as easier as now.
> Every passmanger will clear the printfs and need a new map to avoid disturb
> each other. It is just ok when only one pass exist, but in multithread there
> will be a lot of passes in the same time. If using interface like:
>  *PrintfParser::getPrintfInfo() { return &printfs; } It still a static one, and
> threads may have disturb.
> 
> 
> -----Original Message-----
> From: Song, Ruiling
> Sent: Friday, November 6, 2015 9:54 AM
> To: Pan, Xiuli <xiuli.pan at intel.com>; Pan, Xiuli <xiuli.pan at intel.com>;
> beignet at lists.freedesktop.org
> Subject: RE: [Beignet] [PATCH] GBE: fix printf class static variable bug
> 
> Thread_local is not needed to pass data from one llvm pass to another.
> You can still access the info after pass that has already run.
> In a later llvm pass, you can use getAnalysis<PrintfParser>() to get the the
> PrintfParser pass handle.
> 
> Then expose an interface in PrintfParser then you can query the printfInfo in
> GenWriter.
> 
> Thanks!
> Ruiling
> > -----Original Message-----
> > From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf
> > Of Pan, Xiuli
> > Sent: Friday, November 6, 2015 9:44 AM
> > To: Pan, Xiuli; beignet at lists.freedesktop.org
> > Subject: Re: [Beignet] [PATCH] GBE: fix printf class static variable
> > bug
> >
> > Ping for review.
> >
> > -----Original Message-----
> > From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf
> > Of Pan Xiuli
> > Sent: Tuesday, November 3, 2015 11:30 AM
> > To: beignet at lists.freedesktop.org
> > Cc: Pan, Xiuli <xiuli.pan at intel.com>
> > Subject: [Beignet] [PATCH] GBE: fix printf class static variable bug
> >
> > The PrintfParse::printfs static is not thread safe and maybe reset or
> > adding something wrong when runing in mutlithread. Fix the problem by
> > change the printfs to a thread local variable.
> >
> > Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
> > ---
> >  backend/src/llvm/llvm_printf_parser.cpp | 9 ++++-----
> >  1 file changed, 4 insertions(+), 5 deletions(-)
> >
> > diff --git a/backend/src/llvm/llvm_printf_parser.cpp
> > b/backend/src/llvm/llvm_printf_parser.cpp
> > index bdaed8a..93f87ea 100644
> > --- a/backend/src/llvm/llvm_printf_parser.cpp
> > +++ b/backend/src/llvm/llvm_printf_parser.cpp
> > @@ -45,6 +45,8 @@ namespace gbe
> >  {
> >    using namespace ir;
> >
> > +  thread_local map<CallInst*, PrintfSet::PrintfFmt*> printfs;
> > +
> >    /* Return the conversion_specifier if succeed, -1 if failed. */
> >    static char __parse_printf_state(char *begin, char *end, char**
> > rend, PrintfState * state)
> >    {
> > @@ -301,7 +303,6 @@ error:
> >      Value* g1Xg2Xg3;
> >      Value* wg_offset;
> >      int out_buf_sizeof_offset;
> > -    static map<CallInst*, PrintfSet::PrintfFmt*> printfs;
> >      int printf_num;
> >      int totalSizeofSize;
> >
> > @@ -972,12 +973,10 @@ error:
> >      return false;
> >    }
> >
> > -  map<CallInst*, PrintfSet::PrintfFmt*> PrintfParser::printfs;
> > -
> >    void* getPrintfInfo(CallInst* inst)
> >    {
> > -    if (PrintfParser::printfs[inst])
> > -      return (void*)PrintfParser::printfs[inst];
> > +    if (printfs[inst])
> > +      return (void*)printfs[inst];
> >      return NULL;
> >    }
> >
> > --
> > 2.1.4
> >
> > _______________________________________________
> > Beignet mailing list
> > Beignet at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/beignet
> > _______________________________________________
> > Beignet mailing list
> > Beignet at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/beignet
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list