[PATCH] Respect TargetLibraryInfo CustomNames in getLibFunc (was: Respect TargetLibraryInfo CustomNames in getAllocationData)

Shea Levy shea at shealevy.com
Sun Mar 2 03:33:28 PST 2014


Hi Duncan,

Thanks for the review. I won't be able to get to it for a few days but
I'll try to get a revised version out later this week.

~Shea

On Sat, Mar 01, 2014 at 07:06:45PM -0800, Duncan P. N. Exon Smith wrote:
> On 2014 Feb 26, at 17:33, Shea Levy <shea at shealevy.com> wrote:
> 
> > Ping?
> > 
> > CCing sabre who is listed as the owner of "Everything not covered by
> > someone else", as it's not obvious to me who owns TargetLibraryInfo.
> 
> I have some comments below.  Firstly, though, where’s the testcase?
> 
> > Index: include/llvm/Target/TargetLibraryInfo.h
> > ===================================================================
> > --- include/llvm/Target/TargetLibraryInfo.h	(revision 201032)
> > +++ include/llvm/Target/TargetLibraryInfo.h	(working copy)
> > @@ -12,6 +12,7 @@
> >  
> >  #include "llvm/ADT/DenseMap.h"
> >  #include "llvm/Pass.h"
> > +#include <map>
> >  
> >  namespace llvm {
> >    class Triple;
> > @@ -676,6 +677,7 @@
> >    virtual void anchor();
> >    unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4];
> >    llvm::DenseMap<unsigned, std::string> CustomNames;
> > +  std::map<std::string, unsigned> ReversedCustomNames;
> 
> Use a StringMap<unsigned> here instead of a std::map.
> 
> >    static const char* StandardNames[LibFunc::NumLibFuncs];
> >  
> >    enum AvailabilityState {
> > @@ -762,8 +764,17 @@
> >    void setAvailableWithName(LibFunc::Func F, StringRef Name) {
> >      if (StandardNames[F] != Name) {
> >        setState(F, CustomName);
> > -      CustomNames[F] = Name;
> > +      llvm::DenseMap<unsigned, std::string>::iterator i =
> 
> Variable names should be capitalized.  Use I instead of i.
> 
> > +          CustomNames.find(F);
> > +      if (i != CustomNames.end()) {
> > +        ReversedCustomNames.erase(i->second);
> > +        i->second = Name;
> > +        CustomNames.insert(*i);
> 
> What's this CustomNames.insert() call for?  Looks like a no-op.
> 
> > +      } else
> > +        CustomNames[F] = Name;
> > +      ReversedCustomNames[Name] = F;
> >        assert(CustomNames.find(F) != CustomNames.end());
> > +      assert(ReversedCustomNames.find(Name) != ReversedCustomNames.end());
> 
> This is overly verbose.  I'd update it to:
> 
>     assert(ReversedCustumNames.count(Name));
> 
> You may as well update the other asseriton, as well.
> 
> >      } else {
> >        setState(F, StandardName);
> >      }
> > Index: lib/Target/TargetLibraryInfo.cpp
> > ===================================================================
> > --- lib/Target/TargetLibraryInfo.cpp	(revision 201032)
> > +++ lib/Target/TargetLibraryInfo.cpp	(working copy)
> > @@ -684,6 +684,7 @@
> >    : ImmutablePass(ID) {
> >    memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
> >    CustomNames = TLI.CustomNames;
> > +  ReversedCustomNames = TLI.ReversedCustomNames;
> >  }
> >  
> >  namespace {
> > @@ -707,9 +708,6 @@
> >  
> >  bool TargetLibraryInfo::getLibFunc(StringRef funcName,
> >                                     LibFunc::Func &F) const {
> > -  const char **Start = &StandardNames[0];
> > -  const char **End = &StandardNames[LibFunc::NumLibFuncs];
> > -
> >    // Filter out empty names and names containing null bytes, those can't be in
> >    // our table.
> >    if (funcName.empty() || funcName.find('\0') != StringRef::npos)
> > @@ -719,10 +717,25 @@
> >    // strip it if present.
> >    if (funcName.front() == '\01')
> >      funcName = funcName.substr(1);
> > +
> > +  // First see if funcName is in CustomNames
> > +  std::map<std::string, unsigned>::const_iterator i =
> > +      ReversedCustomNames.find(funcName);
> 
> Again, use I instead of i.
> 
> > +  if (i != ReversedCustomNames.end()) {
> > +      F = (LibFunc::Func) i->second;
> 
> Too much indentation here.  Should be two spaces for indented blocks.
> 
> > +      if (getState(F) == CustomName)
> > +          return true;
> 
> This flow isn't quite right.  You've already set F, but now might not return
> true.  The header docs for getLibFunc say that F changes iff the library
> function is found.
> 
> I think this makes more sense:
> 
>     if (I != ReversedCustomNames.end())
>       if (getState((LibFunc::Func)I->second) == CustomName) {
>         F = (LibFunc::Func)I->second;
>         return true;
>       }
> 
> > +  }
> > +
> > +  // Now check if it's a StandardName
> > +  const char **Start = &StandardNames[0];
> > +  const char **End = &StandardNames[LibFunc::NumLibFuncs];
> > +
> >    const char **I = std::lower_bound(Start, End, funcName, StringComparator());
> >    if (I != End && *I == funcName) {
> >      F = (LibFunc::Func)(I - Start);
> > -    return true;
> > +    if (getState(F) == StandardName)
> > +        return true;
> 
> Same comment here.  Also, watch the indentation.
> 
> >   }
> >   return false;
> > }
> 




More information about the llvm-commits mailing list