[PATCH] Respect TargetLibraryInfo CustomNames in getLibFunc (was: Respect TargetLibraryInfo CustomNames in getAllocationData)
Shea Levy
shea at shealevy.com
Mon Feb 10 12:55:17 PST 2014
OK, I've attached a patch to fix getLibFunc. Thanks for the feedback!
~Shea
On Mon, Feb 10, 2014 at 07:51:47PM -0000, Nuno Lopes wrote:
> >>Hi all,
> >>
> >>Currently, getAllocationData in MemoryBuiltins.cpp (a helper used for
> >>functions like isAllocLikeFn) uses TargetLibraryInfo::getLibFunc on
> >>the
> >>passed in function name to determine if it corresponds to a
> >>LibFunc::Func. Unfortunately, getLibFunc looks up Funcs by
> >>StandardName
> >>(e.g. "malloc" -> LibFunc::Func::malloc) and doesn't respect any
> >>overridden names set by TargetLibraryInfo::setAvailableWithName. This
> >>is
> >>perhaps a bug in getLibFunc (if it isn't, getLibFunc should probably
> >>be
> >>static), but since existing code may depend on this behavior
> >
> >Someone else may disagree ;) -- but I see no reason to do it this way. If
> >the current code ignores name substitutions made using
> >setAvailableWithName, then it is broken, and should be fixed. Please
> >submit a patch to properly fix the code in getLibFunc, thanks!
>
> I second that. I did a quick grep for getLibFunc() usage and it seems that
> the desired behavior is the proper one that you describe.
> So, I agree with Hal in that it should be getLibFunc() that should be fixed.
>
> Thanks,
> Nuno
>
>
> >-Hal
> >
> >>the
> >>attached patch instead modifies getAllocationData to compare the name
> >>associated with each of the Funcs in AllocationFnData with the
> >>passed-in
> >>function names, and if it matches (which will by the way never be
> >>true
> >>if the Func is not enabled for that TLI) then that is the Func used
> >>for
> >>the rest of the function.
> >>
> >>My test case for this was compiling some IR that had a superfluous
> >>call
> >>to GC_malloc (return value unused) using a PassManagerBuilder at -O3.
> >>By
> >>default, the call wasn't optimized away (as expected), but when I set
> >>the builder's LibraryInfo to one with Func::malloc set to
> >>"GC_malloc",
> >>it was optimized away only with this patch applied.
> >>
> >>Cheers,
> >>Shea Levy
> >>
> >>P.S. I am not currently subscribed to the list, so please CC me in
> >>replies (though I'll check the list archives periodically for replies
> >>as
> >>well)
>
-------------- next part --------------
Index: lib/Target/TargetLibraryInfo.cpp
===================================================================
--- lib/Target/TargetLibraryInfo.cpp (revision 201032)
+++ lib/Target/TargetLibraryInfo.cpp (working copy)
@@ -707,9 +707,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 +716,25 @@
// strip it if present.
if (funcName.front() == '\01')
funcName = funcName.substr(1);
+
+ // First see if funcName is in CustomNames
+ for (DenseMap<unsigned, std::string>::const_iterator i = CustomNames.begin(); i != CustomNames.end(); ++i) {
+ if (funcName == i->second) {
+ F = (LibFunc::Func) i->first;
+ if (getState(F) == CustomName)
+ 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;
}
return false;
}
More information about the llvm-commits
mailing list