mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
Add new getLibFunc method to TargetLibraryInfo.
This just provides a way to look up a LibFunc::Func enum value for a function name. Alphabetize the enums and function names so we can use a binary search. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161231 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -18,36 +18,47 @@ namespace llvm {
|
|||||||
|
|
||||||
namespace LibFunc {
|
namespace LibFunc {
|
||||||
enum Func {
|
enum Func {
|
||||||
|
/// int __cxa_atexit(void (*f)(void *), void *p, void *d);
|
||||||
|
cxa_atexit,
|
||||||
|
/// void __cxa_guard_abort(guard_t *guard);
|
||||||
|
/// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi.
|
||||||
|
cxa_guard_abort,
|
||||||
|
/// int __cxa_guard_acquire(guard_t *guard);
|
||||||
|
cxa_guard_acquire,
|
||||||
|
/// void __cxa_guard_release(guard_t *guard);
|
||||||
|
cxa_guard_release,
|
||||||
|
/// void *__memcpy_chk(void *s1, const void *s2, size_t n, size_t s1size);
|
||||||
|
memcpy_chk,
|
||||||
/// double acos(double x);
|
/// double acos(double x);
|
||||||
acos,
|
acos,
|
||||||
/// long double acosl(long double x);
|
|
||||||
acosl,
|
|
||||||
/// float acosf(float x);
|
/// float acosf(float x);
|
||||||
acosf,
|
acosf,
|
||||||
|
/// long double acosl(long double x);
|
||||||
|
acosl,
|
||||||
/// double asin(double x);
|
/// double asin(double x);
|
||||||
asin,
|
asin,
|
||||||
/// long double asinl(long double x);
|
|
||||||
asinl,
|
|
||||||
/// float asinf(float x);
|
/// float asinf(float x);
|
||||||
asinf,
|
asinf,
|
||||||
|
/// long double asinl(long double x);
|
||||||
|
asinl,
|
||||||
/// double atan(double x);
|
/// double atan(double x);
|
||||||
atan,
|
atan,
|
||||||
/// long double atanl(long double x);
|
|
||||||
atanl,
|
|
||||||
/// float atanf(float x);
|
|
||||||
atanf,
|
|
||||||
/// double atan2(double y, double x);
|
/// double atan2(double y, double x);
|
||||||
atan2,
|
atan2,
|
||||||
/// long double atan2l(long double y, long double x);
|
|
||||||
atan2l,
|
|
||||||
/// float atan2f(float y, float x);
|
/// float atan2f(float y, float x);
|
||||||
atan2f,
|
atan2f,
|
||||||
|
/// long double atan2l(long double y, long double x);
|
||||||
|
atan2l,
|
||||||
|
/// float atanf(float x);
|
||||||
|
atanf,
|
||||||
|
/// long double atanl(long double x);
|
||||||
|
atanl,
|
||||||
/// double ceil(double x);
|
/// double ceil(double x);
|
||||||
ceil,
|
ceil,
|
||||||
/// long double ceill(long double x);
|
|
||||||
ceill,
|
|
||||||
/// float ceilf(float x);
|
/// float ceilf(float x);
|
||||||
ceilf,
|
ceilf,
|
||||||
|
/// long double ceill(long double x);
|
||||||
|
ceill,
|
||||||
/// double copysign(double x, double y);
|
/// double copysign(double x, double y);
|
||||||
copysign,
|
copysign,
|
||||||
/// float copysignf(float x, float y);
|
/// float copysignf(float x, float y);
|
||||||
@ -56,54 +67,54 @@ namespace llvm {
|
|||||||
copysignl,
|
copysignl,
|
||||||
/// double cos(double x);
|
/// double cos(double x);
|
||||||
cos,
|
cos,
|
||||||
/// long double cosl(long double x);
|
|
||||||
cosl,
|
|
||||||
/// float cosf(float x);
|
/// float cosf(float x);
|
||||||
cosf,
|
cosf,
|
||||||
/// double cosh(double x);
|
/// double cosh(double x);
|
||||||
cosh,
|
cosh,
|
||||||
/// long double coshl(long double x);
|
|
||||||
coshl,
|
|
||||||
/// float coshf(float x);
|
/// float coshf(float x);
|
||||||
coshf,
|
coshf,
|
||||||
|
/// long double coshl(long double x);
|
||||||
|
coshl,
|
||||||
|
/// long double cosl(long double x);
|
||||||
|
cosl,
|
||||||
/// double exp(double x);
|
/// double exp(double x);
|
||||||
exp,
|
exp,
|
||||||
/// long double expl(long double x);
|
|
||||||
expl,
|
|
||||||
/// float expf(float x);
|
|
||||||
expf,
|
|
||||||
/// double exp2(double x);
|
/// double exp2(double x);
|
||||||
exp2,
|
exp2,
|
||||||
/// long double exp2l(long double x);
|
|
||||||
exp2l,
|
|
||||||
/// float exp2f(float x);
|
/// float exp2f(float x);
|
||||||
exp2f,
|
exp2f,
|
||||||
|
/// long double exp2l(long double x);
|
||||||
|
exp2l,
|
||||||
|
/// float expf(float x);
|
||||||
|
expf,
|
||||||
|
/// long double expl(long double x);
|
||||||
|
expl,
|
||||||
/// double expm1(double x);
|
/// double expm1(double x);
|
||||||
expm1,
|
expm1,
|
||||||
/// long double expm1l(long double x);
|
|
||||||
expm1l,
|
|
||||||
/// float expm1f(float x);
|
/// float expm1f(float x);
|
||||||
expm1f,
|
expm1f,
|
||||||
|
/// long double expm1l(long double x);
|
||||||
|
expm1l,
|
||||||
/// double fabs(double x);
|
/// double fabs(double x);
|
||||||
fabs,
|
fabs,
|
||||||
/// long double fabsl(long double x);
|
|
||||||
fabsl,
|
|
||||||
/// float fabsf(float x);
|
/// float fabsf(float x);
|
||||||
fabsf,
|
fabsf,
|
||||||
/// double floor(double x);
|
/// long double fabsl(long double x);
|
||||||
floor,
|
fabsl,
|
||||||
/// long double floorl(long double x);
|
|
||||||
floorl,
|
|
||||||
/// float floorf(float x);
|
|
||||||
floorf,
|
|
||||||
/// int fiprintf(FILE *stream, const char *format, ...);
|
/// int fiprintf(FILE *stream, const char *format, ...);
|
||||||
fiprintf,
|
fiprintf,
|
||||||
|
/// double floor(double x);
|
||||||
|
floor,
|
||||||
|
/// float floorf(float x);
|
||||||
|
floorf,
|
||||||
|
/// long double floorl(long double x);
|
||||||
|
floorl,
|
||||||
/// double fmod(double x, double y);
|
/// double fmod(double x, double y);
|
||||||
fmod,
|
fmod,
|
||||||
/// long double fmodl(long double x, long double y);
|
|
||||||
fmodl,
|
|
||||||
/// float fmodf(float x, float y);
|
/// float fmodf(float x, float y);
|
||||||
fmodf,
|
fmodf,
|
||||||
|
/// long double fmodl(long double x, long double y);
|
||||||
|
fmodl,
|
||||||
/// int fputc(int c, FILE *stream);
|
/// int fputc(int c, FILE *stream);
|
||||||
fputc,
|
fputc,
|
||||||
/// int fputs(const char *s, FILE *stream);
|
/// int fputs(const char *s, FILE *stream);
|
||||||
@ -115,28 +126,28 @@ namespace llvm {
|
|||||||
iprintf,
|
iprintf,
|
||||||
/// double log(double x);
|
/// double log(double x);
|
||||||
log,
|
log,
|
||||||
/// long double logl(long double x);
|
|
||||||
logl,
|
|
||||||
/// float logf(float x);
|
|
||||||
logf,
|
|
||||||
/// double log2(double x);
|
|
||||||
log2,
|
|
||||||
/// double long double log2l(long double x);
|
|
||||||
log2l,
|
|
||||||
/// float log2f(float x);
|
|
||||||
log2f,
|
|
||||||
/// double log10(double x);
|
/// double log10(double x);
|
||||||
log10,
|
log10,
|
||||||
/// long double log10l(long double x);
|
|
||||||
log10l,
|
|
||||||
/// float log10f(float x);
|
/// float log10f(float x);
|
||||||
log10f,
|
log10f,
|
||||||
|
/// long double log10l(long double x);
|
||||||
|
log10l,
|
||||||
/// double log1p(double x);
|
/// double log1p(double x);
|
||||||
log1p,
|
log1p,
|
||||||
/// long double log1pl(long double x);
|
|
||||||
log1pl,
|
|
||||||
/// float log1pf(float x);
|
/// float log1pf(float x);
|
||||||
log1pf,
|
log1pf,
|
||||||
|
/// long double log1pl(long double x);
|
||||||
|
log1pl,
|
||||||
|
/// double log2(double x);
|
||||||
|
log2,
|
||||||
|
/// float log2f(float x);
|
||||||
|
log2f,
|
||||||
|
/// double long double log2l(long double x);
|
||||||
|
log2l,
|
||||||
|
/// float logf(float x);
|
||||||
|
logf,
|
||||||
|
/// long double logl(long double x);
|
||||||
|
logl,
|
||||||
/// void *memchr(const void *s, int c, size_t n);
|
/// void *memchr(const void *s, int c, size_t n);
|
||||||
memchr,
|
memchr,
|
||||||
/// int memcmp(const void *s1, const void *s2, size_t n);
|
/// int memcmp(const void *s1, const void *s2, size_t n);
|
||||||
@ -179,24 +190,24 @@ namespace llvm {
|
|||||||
roundl,
|
roundl,
|
||||||
/// double sin(double x);
|
/// double sin(double x);
|
||||||
sin,
|
sin,
|
||||||
/// long double sinl(long double x);
|
|
||||||
sinl,
|
|
||||||
/// float sinf(float x);
|
/// float sinf(float x);
|
||||||
sinf,
|
sinf,
|
||||||
/// double sinh(double x);
|
/// double sinh(double x);
|
||||||
sinh,
|
sinh,
|
||||||
/// long double sinhl(long double x);
|
|
||||||
sinhl,
|
|
||||||
/// float sinhf(float x);
|
/// float sinhf(float x);
|
||||||
sinhf,
|
sinhf,
|
||||||
|
/// long double sinhl(long double x);
|
||||||
|
sinhl,
|
||||||
|
/// long double sinl(long double x);
|
||||||
|
sinl,
|
||||||
/// int siprintf(char *str, const char *format, ...);
|
/// int siprintf(char *str, const char *format, ...);
|
||||||
siprintf,
|
siprintf,
|
||||||
/// double sqrt(double x);
|
/// double sqrt(double x);
|
||||||
sqrt,
|
sqrt,
|
||||||
/// long double sqrtl(long double x);
|
|
||||||
sqrtl,
|
|
||||||
/// float sqrtf(float x);
|
/// float sqrtf(float x);
|
||||||
sqrtf,
|
sqrtf,
|
||||||
|
/// long double sqrtl(long double x);
|
||||||
|
sqrtl,
|
||||||
/// char *strcat(char *s1, const char *s2);
|
/// char *strcat(char *s1, const char *s2);
|
||||||
strcat,
|
strcat,
|
||||||
/// char *strchr(const char *s, int c);
|
/// char *strchr(const char *s, int c);
|
||||||
@ -215,33 +226,22 @@ namespace llvm {
|
|||||||
strnlen,
|
strnlen,
|
||||||
/// double tan(double x);
|
/// double tan(double x);
|
||||||
tan,
|
tan,
|
||||||
/// long double tanl(long double x);
|
|
||||||
tanl,
|
|
||||||
/// float tanf(float x);
|
/// float tanf(float x);
|
||||||
tanf,
|
tanf,
|
||||||
/// double tanh(double x);
|
/// double tanh(double x);
|
||||||
tanh,
|
tanh,
|
||||||
/// long double tanhl(long double x);
|
|
||||||
tanhl,
|
|
||||||
/// float tanhf(float x);
|
/// float tanhf(float x);
|
||||||
tanhf,
|
tanhf,
|
||||||
|
/// long double tanhl(long double x);
|
||||||
|
tanhl,
|
||||||
|
/// long double tanl(long double x);
|
||||||
|
tanl,
|
||||||
/// double trunc(double x);
|
/// double trunc(double x);
|
||||||
trunc,
|
trunc,
|
||||||
/// float truncf(float x);
|
/// float truncf(float x);
|
||||||
truncf,
|
truncf,
|
||||||
/// long double truncl(long double x);
|
/// long double truncl(long double x);
|
||||||
truncl,
|
truncl,
|
||||||
/// int __cxa_atexit(void (*f)(void *), void *p, void *d);
|
|
||||||
cxa_atexit,
|
|
||||||
/// void __cxa_guard_abort(guard_t *guard);
|
|
||||||
/// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi.
|
|
||||||
cxa_guard_abort,
|
|
||||||
/// int __cxa_guard_acquire(guard_t *guard);
|
|
||||||
cxa_guard_acquire,
|
|
||||||
/// void __cxa_guard_release(guard_t *guard);
|
|
||||||
cxa_guard_release,
|
|
||||||
/// void *__memcpy_chk(void *s1, const void *s2, size_t n, size_t s1size);
|
|
||||||
memcpy_chk,
|
|
||||||
|
|
||||||
NumLibFuncs
|
NumLibFuncs
|
||||||
};
|
};
|
||||||
@ -275,6 +275,10 @@ public:
|
|||||||
TargetLibraryInfo(const Triple &T);
|
TargetLibraryInfo(const Triple &T);
|
||||||
explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
|
explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
|
||||||
|
|
||||||
|
/// getLibFunc - Search for a particular function name. If it is one of the
|
||||||
|
/// known library functions, return true and set F to the corresponding value.
|
||||||
|
bool getLibFunc(StringRef funcName, LibFunc::Func &F) const;
|
||||||
|
|
||||||
/// has - This function is used by optimizations that want to match on or form
|
/// has - This function is used by optimizations that want to match on or form
|
||||||
/// a given library function.
|
/// a given library function.
|
||||||
bool has(LibFunc::Func F) const {
|
bool has(LibFunc::Func F) const {
|
||||||
|
@ -24,65 +24,70 @@ void TargetLibraryInfo::anchor() { }
|
|||||||
|
|
||||||
const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
|
const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
|
||||||
{
|
{
|
||||||
|
"__cxa_atexit",
|
||||||
|
"__cxa_guard_abort",
|
||||||
|
"__cxa_guard_acquire",
|
||||||
|
"__cxa_guard_release",
|
||||||
|
"__memcpy_chk",
|
||||||
"acos",
|
"acos",
|
||||||
"acosl",
|
|
||||||
"acosf",
|
"acosf",
|
||||||
|
"acosl",
|
||||||
"asin",
|
"asin",
|
||||||
"asinl",
|
|
||||||
"asinf",
|
"asinf",
|
||||||
|
"asinl",
|
||||||
"atan",
|
"atan",
|
||||||
"atanl",
|
|
||||||
"atanf",
|
|
||||||
"atan2",
|
"atan2",
|
||||||
"atan2l",
|
|
||||||
"atan2f",
|
"atan2f",
|
||||||
|
"atan2l",
|
||||||
|
"atanf",
|
||||||
|
"atanl",
|
||||||
"ceil",
|
"ceil",
|
||||||
"ceill",
|
|
||||||
"ceilf",
|
"ceilf",
|
||||||
|
"ceill",
|
||||||
"copysign",
|
"copysign",
|
||||||
"copysignf",
|
"copysignf",
|
||||||
"copysignl",
|
"copysignl",
|
||||||
"cos",
|
"cos",
|
||||||
"cosl",
|
|
||||||
"cosf",
|
"cosf",
|
||||||
"cosh",
|
"cosh",
|
||||||
"coshl",
|
|
||||||
"coshf",
|
"coshf",
|
||||||
|
"coshl",
|
||||||
|
"cosl",
|
||||||
"exp",
|
"exp",
|
||||||
"expl",
|
|
||||||
"expf",
|
|
||||||
"exp2",
|
"exp2",
|
||||||
"exp2l",
|
|
||||||
"exp2f",
|
"exp2f",
|
||||||
|
"exp2l",
|
||||||
|
"expf",
|
||||||
|
"expl",
|
||||||
"expm1",
|
"expm1",
|
||||||
"expm1l",
|
|
||||||
"expm1f",
|
"expm1f",
|
||||||
|
"expm1l",
|
||||||
"fabs",
|
"fabs",
|
||||||
"fabsl",
|
|
||||||
"fabsf",
|
"fabsf",
|
||||||
"floor",
|
"fabsl",
|
||||||
"floorl",
|
|
||||||
"floorf",
|
|
||||||
"fiprintf",
|
"fiprintf",
|
||||||
|
"floor",
|
||||||
|
"floorf",
|
||||||
|
"floorl",
|
||||||
"fmod",
|
"fmod",
|
||||||
"fmodl",
|
|
||||||
"fmodf",
|
"fmodf",
|
||||||
|
"fmodl",
|
||||||
"fputc",
|
"fputc",
|
||||||
"fputs",
|
"fputs",
|
||||||
"fwrite",
|
"fwrite",
|
||||||
"iprintf",
|
"iprintf",
|
||||||
"log",
|
"log",
|
||||||
"logl",
|
|
||||||
"logf",
|
|
||||||
"log2",
|
|
||||||
"log2l",
|
|
||||||
"log2f",
|
|
||||||
"log10",
|
"log10",
|
||||||
"log10l",
|
|
||||||
"log10f",
|
"log10f",
|
||||||
|
"log10l",
|
||||||
"log1p",
|
"log1p",
|
||||||
"log1pl",
|
|
||||||
"log1pf",
|
"log1pf",
|
||||||
|
"log1pl",
|
||||||
|
"log2",
|
||||||
|
"log2f",
|
||||||
|
"log2l",
|
||||||
|
"logf",
|
||||||
|
"logl",
|
||||||
"memchr",
|
"memchr",
|
||||||
"memcmp",
|
"memcmp",
|
||||||
"memcpy",
|
"memcpy",
|
||||||
@ -104,15 +109,15 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
|
|||||||
"roundf",
|
"roundf",
|
||||||
"roundl",
|
"roundl",
|
||||||
"sin",
|
"sin",
|
||||||
"sinl",
|
|
||||||
"sinf",
|
"sinf",
|
||||||
"sinh",
|
"sinh",
|
||||||
"sinhl",
|
|
||||||
"sinhf",
|
"sinhf",
|
||||||
|
"sinhl",
|
||||||
|
"sinl",
|
||||||
"siprintf",
|
"siprintf",
|
||||||
"sqrt",
|
"sqrt",
|
||||||
"sqrtl",
|
|
||||||
"sqrtf",
|
"sqrtf",
|
||||||
|
"sqrtl",
|
||||||
"strcat",
|
"strcat",
|
||||||
"strchr",
|
"strchr",
|
||||||
"strcpy",
|
"strcpy",
|
||||||
@ -122,27 +127,30 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
|
|||||||
"strncpy",
|
"strncpy",
|
||||||
"strnlen",
|
"strnlen",
|
||||||
"tan",
|
"tan",
|
||||||
"tanl",
|
|
||||||
"tanf",
|
"tanf",
|
||||||
"tanh",
|
"tanh",
|
||||||
"tanhl",
|
|
||||||
"tanhf",
|
"tanhf",
|
||||||
|
"tanhl",
|
||||||
|
"tanl",
|
||||||
"trunc",
|
"trunc",
|
||||||
"truncf",
|
"truncf",
|
||||||
"truncl",
|
"truncl"
|
||||||
"__cxa_atexit",
|
|
||||||
"__cxa_guard_abort",
|
|
||||||
"__cxa_guard_acquire",
|
|
||||||
"__cxa_guard_release",
|
|
||||||
"__memcpy_chk"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// initialize - Initialize the set of available library functions based on the
|
/// initialize - Initialize the set of available library functions based on the
|
||||||
/// specified target triple. This should be carefully written so that a missing
|
/// specified target triple. This should be carefully written so that a missing
|
||||||
/// target triple gets a sane set of defaults.
|
/// target triple gets a sane set of defaults.
|
||||||
static void initialize(TargetLibraryInfo &TLI, const Triple &T) {
|
static void initialize(TargetLibraryInfo &TLI, const Triple &T,
|
||||||
|
const char **StandardNames) {
|
||||||
initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
|
initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
// Verify that the StandardNames array is in alphabetical order.
|
||||||
|
for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
|
||||||
|
if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
|
||||||
|
llvm_unreachable("TargetLibraryInfo function names must be sorted");
|
||||||
|
}
|
||||||
|
#endif // !NDEBUG
|
||||||
|
|
||||||
// memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
|
// memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
|
||||||
if (T.isMacOSX()) {
|
if (T.isMacOSX()) {
|
||||||
@ -254,14 +262,14 @@ TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
|
|||||||
// Default to everything being available.
|
// Default to everything being available.
|
||||||
memset(AvailableArray, -1, sizeof(AvailableArray));
|
memset(AvailableArray, -1, sizeof(AvailableArray));
|
||||||
|
|
||||||
initialize(*this, Triple());
|
initialize(*this, Triple(), StandardNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
|
TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
|
||||||
// Default to everything being available.
|
// Default to everything being available.
|
||||||
memset(AvailableArray, -1, sizeof(AvailableArray));
|
memset(AvailableArray, -1, sizeof(AvailableArray));
|
||||||
|
|
||||||
initialize(*this, T);
|
initialize(*this, T, StandardNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
|
TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
|
||||||
@ -270,6 +278,17 @@ TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
|
|||||||
CustomNames = TLI.CustomNames;
|
CustomNames = TLI.CustomNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TargetLibraryInfo::getLibFunc(StringRef funcName,
|
||||||
|
LibFunc::Func &F) const {
|
||||||
|
const char **Start = &StandardNames[0];
|
||||||
|
const char **End = &StandardNames[LibFunc::NumLibFuncs];
|
||||||
|
const char **I = std::lower_bound(Start, End, funcName);
|
||||||
|
if (I != End && *I == funcName) {
|
||||||
|
F = (LibFunc::Func)(I - Start);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// disableAllFunctions - This disables all builtins, which is used for options
|
/// disableAllFunctions - This disables all builtins, which is used for options
|
||||||
/// like -fno-builtin.
|
/// like -fno-builtin.
|
||||||
|
Reference in New Issue
Block a user