Skip to content

Commit 59325c9

Browse files
ArsenArsentru
authored andcommitted
libcxx: Don't apply ABI tags to extern "C" fns
GCC rejects ABI tags on non mangled functions, as they would otherwise be a no-op. This commit replaces such instances with equivalent _LIBCPP_HIDE_FROM_ABI constants but without ABI tags attached. .../include/c++/v1/__support/musl/xlocale.h:28:68: error: 'abi_tag' attribute applied to extern "C" declaration 'long long int strtoll_l(const char*, char**, int, locale_t)' 28 | strtoll_l(const char *__nptr, char **__endptr, int __base, locale_t) { | ^ Bug: https://bugs.gentoo.org/869038 Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D142415
1 parent 46d5a57 commit 59325c9

File tree

7 files changed

+67
-152
lines changed

7 files changed

+67
-152
lines changed

libcxx/include/__config

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,11 @@ typedef __char32_t char32_t;
629629
# else
630630
# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
631631
# endif
632-
# define _LIBCPP_HIDE_FROM_ABI_VIRTUAL _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
632+
# define _LIBCPP_HIDE_FROM_ABI_VIRTUAL _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
633+
634+
// This macro provides a HIDE_FROM_ABI equivalent that can be applied to extern
635+
// "C" function, as those lack mangling.
636+
# define _LIBCPP_HIDE_FROM_ABI_C _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
633637

634638
# ifdef _LIBCPP_BUILDING_LIBRARY
635639
# if _LIBCPP_ABI_VERSION > 1

libcxx/include/__support/android/locale_bionic.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,15 @@ extern "C" {
4646
extern "C" {
4747
#endif
4848

49-
inline _LIBCPP_HIDE_FROM_ABI float
50-
strtof_l(const char* __nptr, char** __endptr, locale_t) {
49+
inline _LIBCPP_HIDE_FROM_ABI_C float strtof_l(const char* __nptr, char** __endptr, locale_t) {
5150
return ::strtof(__nptr, __endptr);
5251
}
5352

54-
inline _LIBCPP_HIDE_FROM_ABI double
55-
strtod_l(const char* __nptr, char** __endptr, locale_t) {
53+
inline _LIBCPP_HIDE_FROM_ABI_C double strtod_l(const char* __nptr, char** __endptr, locale_t) {
5654
return ::strtod(__nptr, __endptr);
5755
}
5856

59-
inline _LIBCPP_HIDE_FROM_ABI long
60-
strtol_l(const char* __nptr, char** __endptr, int __base, locale_t) {
57+
inline _LIBCPP_HIDE_FROM_ABI_C long strtol_l(const char* __nptr, char** __endptr, int __base, locale_t) {
6158
return ::strtol(__nptr, __endptr, __base);
6259
}
6360

libcxx/include/__support/musl/xlocale.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,24 @@
2424
extern "C" {
2525
#endif
2626

27-
inline _LIBCPP_HIDE_FROM_ABI long long
28-
strtoll_l(const char *__nptr, char **__endptr, int __base, locale_t) {
27+
inline _LIBCPP_HIDE_FROM_ABI_C long long strtoll_l(const char* __nptr, char** __endptr, int __base, locale_t) {
2928
return ::strtoll(__nptr, __endptr, __base);
3029
}
3130

32-
inline _LIBCPP_HIDE_FROM_ABI unsigned long long
33-
strtoull_l(const char *__nptr, char **__endptr, int __base, locale_t) {
31+
inline _LIBCPP_HIDE_FROM_ABI_C unsigned long long
32+
strtoull_l(const char* __nptr, char** __endptr, int __base, locale_t) {
3433
return ::strtoull(__nptr, __endptr, __base);
3534
}
3635

37-
inline _LIBCPP_HIDE_FROM_ABI long long
38-
wcstoll_l(const wchar_t *__nptr, wchar_t **__endptr, int __base, locale_t) {
36+
inline _LIBCPP_HIDE_FROM_ABI_C long long wcstoll_l(const wchar_t* __nptr, wchar_t** __endptr, int __base, locale_t) {
3937
return ::wcstoll(__nptr, __endptr, __base);
4038
}
4139

42-
inline _LIBCPP_HIDE_FROM_ABI unsigned long long
43-
wcstoull_l(const wchar_t *__nptr, wchar_t **__endptr, int __base, locale_t) {
40+
inline _LIBCPP_HIDE_FROM_ABI_C long long wcstoull_l(const wchar_t* __nptr, wchar_t** __endptr, int __base, locale_t) {
4441
return ::wcstoull(__nptr, __endptr, __base);
4542
}
4643

47-
inline _LIBCPP_HIDE_FROM_ABI long double
48-
wcstold_l(const wchar_t *__nptr, wchar_t **__endptr, locale_t) {
44+
inline _LIBCPP_HIDE_FROM_ABI_C long double wcstold_l(const wchar_t* __nptr, wchar_t** __endptr, locale_t) {
4945
return ::wcstold(__nptr, __endptr);
5046
}
5147

libcxx/include/__support/openbsd/xlocale.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,14 @@
2020
extern "C" {
2121
#endif
2222

23-
24-
inline _LIBCPP_HIDE_FROM_ABI long
25-
strtol_l(const char *__nptr, char **__endptr, int __base, locale_t) {
23+
inline _LIBCPP_HIDE_FROM_ABI_C long strtol_l(const char* __nptr, char** __endptr, int __base, locale_t) {
2624
return ::strtol(__nptr, __endptr, __base);
2725
}
2826

29-
inline _LIBCPP_HIDE_FROM_ABI unsigned long
30-
strtoul_l(const char *__nptr, char **__endptr, int __base, locale_t) {
27+
inline _LIBCPP_HIDE_FROM_ABI_C unsigned long strtoul_l(const char* __nptr, char** __endptr, int __base, locale_t) {
3128
return ::strtoul(__nptr, __endptr, __base);
3229
}
3330

34-
3531
#ifdef __cplusplus
3632
}
3733
#endif

libcxx/include/__support/xlocale/__nop_locale_mgmt.h

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,13 @@ extern "C" {
1919
// Patch over lack of extended locale support
2020
typedef void *locale_t;
2121

22-
inline _LIBCPP_HIDE_FROM_ABI locale_t
23-
duplocale(locale_t) {
24-
return NULL;
25-
}
26-
27-
inline _LIBCPP_HIDE_FROM_ABI void
28-
freelocale(locale_t) {
29-
}
30-
31-
inline _LIBCPP_HIDE_FROM_ABI locale_t
32-
newlocale(int, const char *, locale_t) {
33-
return NULL;
34-
}
35-
36-
inline _LIBCPP_HIDE_FROM_ABI locale_t
37-
uselocale(locale_t) {
38-
return NULL;
39-
}
22+
inline _LIBCPP_HIDE_FROM_ABI_C locale_t duplocale(locale_t) { return NULL; }
23+
24+
inline _LIBCPP_HIDE_FROM_ABI_C void freelocale(locale_t) {}
25+
26+
inline _LIBCPP_HIDE_FROM_ABI_C locale_t newlocale(int, const char*, locale_t) { return NULL; }
27+
28+
inline _LIBCPP_HIDE_FROM_ABI_C locale_t uselocale(locale_t) { return NULL; }
4029

4130
#define LC_COLLATE_MASK (1 << LC_COLLATE)
4231
#define LC_CTYPE_MASK (1 << LC_CTYPE)

libcxx/include/__support/xlocale/__posix_l_fallback.h

Lines changed: 34 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -27,144 +27,83 @@
2727
extern "C" {
2828
#endif
2929

30-
inline _LIBCPP_HIDE_FROM_ABI int isalnum_l(int __c, locale_t) {
31-
return ::isalnum(__c);
32-
}
30+
inline _LIBCPP_HIDE_FROM_ABI_C int isalnum_l(int __c, locale_t) { return ::isalnum(__c); }
3331

34-
inline _LIBCPP_HIDE_FROM_ABI int isalpha_l(int __c, locale_t) {
35-
return ::isalpha(__c);
36-
}
32+
inline _LIBCPP_HIDE_FROM_ABI_C int isalpha_l(int __c, locale_t) { return ::isalpha(__c); }
3733

38-
inline _LIBCPP_HIDE_FROM_ABI int isblank_l(int __c, locale_t) {
39-
return ::isblank(__c);
40-
}
34+
inline _LIBCPP_HIDE_FROM_ABI_C int isblank_l(int __c, locale_t) { return ::isblank(__c); }
4135

42-
inline _LIBCPP_HIDE_FROM_ABI int iscntrl_l(int __c, locale_t) {
43-
return ::iscntrl(__c);
44-
}
36+
inline _LIBCPP_HIDE_FROM_ABI_C int iscntrl_l(int __c, locale_t) { return ::iscntrl(__c); }
4537

46-
inline _LIBCPP_HIDE_FROM_ABI int isdigit_l(int __c, locale_t) {
47-
return ::isdigit(__c);
48-
}
38+
inline _LIBCPP_HIDE_FROM_ABI_C int isdigit_l(int __c, locale_t) { return ::isdigit(__c); }
4939

50-
inline _LIBCPP_HIDE_FROM_ABI int isgraph_l(int __c, locale_t) {
51-
return ::isgraph(__c);
52-
}
40+
inline _LIBCPP_HIDE_FROM_ABI_C int isgraph_l(int __c, locale_t) { return ::isgraph(__c); }
5341

54-
inline _LIBCPP_HIDE_FROM_ABI int islower_l(int __c, locale_t) {
55-
return ::islower(__c);
56-
}
42+
inline _LIBCPP_HIDE_FROM_ABI_C int islower_l(int __c, locale_t) { return ::islower(__c); }
5743

58-
inline _LIBCPP_HIDE_FROM_ABI int isprint_l(int __c, locale_t) {
59-
return ::isprint(__c);
60-
}
44+
inline _LIBCPP_HIDE_FROM_ABI_C int isprint_l(int __c, locale_t) { return ::isprint(__c); }
6145

62-
inline _LIBCPP_HIDE_FROM_ABI int ispunct_l(int __c, locale_t) {
63-
return ::ispunct(__c);
64-
}
46+
inline _LIBCPP_HIDE_FROM_ABI_C int ispunct_l(int __c, locale_t) { return ::ispunct(__c); }
6547

66-
inline _LIBCPP_HIDE_FROM_ABI int isspace_l(int __c, locale_t) {
67-
return ::isspace(__c);
68-
}
48+
inline _LIBCPP_HIDE_FROM_ABI_C int isspace_l(int __c, locale_t) { return ::isspace(__c); }
6949

70-
inline _LIBCPP_HIDE_FROM_ABI int isupper_l(int __c, locale_t) {
71-
return ::isupper(__c);
72-
}
50+
inline _LIBCPP_HIDE_FROM_ABI_C int isupper_l(int __c, locale_t) { return ::isupper(__c); }
7351

74-
inline _LIBCPP_HIDE_FROM_ABI int isxdigit_l(int __c, locale_t) {
75-
return ::isxdigit(__c);
76-
}
52+
inline _LIBCPP_HIDE_FROM_ABI_C int isxdigit_l(int __c, locale_t) { return ::isxdigit(__c); }
7753

78-
inline _LIBCPP_HIDE_FROM_ABI int toupper_l(int __c, locale_t) {
79-
return ::toupper(__c);
80-
}
54+
inline _LIBCPP_HIDE_FROM_ABI_C int toupper_l(int __c, locale_t) { return ::toupper(__c); }
8155

82-
inline _LIBCPP_HIDE_FROM_ABI int tolower_l(int __c, locale_t) {
83-
return ::tolower(__c);
84-
}
56+
inline _LIBCPP_HIDE_FROM_ABI_C int tolower_l(int __c, locale_t) { return ::tolower(__c); }
8557

8658
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
87-
inline _LIBCPP_HIDE_FROM_ABI int iswalnum_l(wint_t __c, locale_t) {
88-
return ::iswalnum(__c);
89-
}
59+
inline _LIBCPP_HIDE_FROM_ABI_C int iswalnum_l(wint_t __c, locale_t) { return ::iswalnum(__c); }
9060

91-
inline _LIBCPP_HIDE_FROM_ABI int iswalpha_l(wint_t __c, locale_t) {
92-
return ::iswalpha(__c);
93-
}
61+
inline _LIBCPP_HIDE_FROM_ABI_C int iswalpha_l(wint_t __c, locale_t) { return ::iswalpha(__c); }
9462

95-
inline _LIBCPP_HIDE_FROM_ABI int iswblank_l(wint_t __c, locale_t) {
96-
return ::iswblank(__c);
97-
}
63+
inline _LIBCPP_HIDE_FROM_ABI_C int iswblank_l(wint_t __c, locale_t) { return ::iswblank(__c); }
9864

99-
inline _LIBCPP_HIDE_FROM_ABI int iswcntrl_l(wint_t __c, locale_t) {
100-
return ::iswcntrl(__c);
101-
}
65+
inline _LIBCPP_HIDE_FROM_ABI_C int iswcntrl_l(wint_t __c, locale_t) { return ::iswcntrl(__c); }
10266

103-
inline _LIBCPP_HIDE_FROM_ABI int iswdigit_l(wint_t __c, locale_t) {
104-
return ::iswdigit(__c);
105-
}
67+
inline _LIBCPP_HIDE_FROM_ABI_C int iswdigit_l(wint_t __c, locale_t) { return ::iswdigit(__c); }
10668

107-
inline _LIBCPP_HIDE_FROM_ABI int iswgraph_l(wint_t __c, locale_t) {
108-
return ::iswgraph(__c);
109-
}
69+
inline _LIBCPP_HIDE_FROM_ABI_C int iswgraph_l(wint_t __c, locale_t) { return ::iswgraph(__c); }
11070

111-
inline _LIBCPP_HIDE_FROM_ABI int iswlower_l(wint_t __c, locale_t) {
112-
return ::iswlower(__c);
113-
}
71+
inline _LIBCPP_HIDE_FROM_ABI_C int iswlower_l(wint_t __c, locale_t) { return ::iswlower(__c); }
11472

115-
inline _LIBCPP_HIDE_FROM_ABI int iswprint_l(wint_t __c, locale_t) {
116-
return ::iswprint(__c);
117-
}
73+
inline _LIBCPP_HIDE_FROM_ABI_C int iswprint_l(wint_t __c, locale_t) { return ::iswprint(__c); }
11874

119-
inline _LIBCPP_HIDE_FROM_ABI int iswpunct_l(wint_t __c, locale_t) {
120-
return ::iswpunct(__c);
121-
}
75+
inline _LIBCPP_HIDE_FROM_ABI_C int iswpunct_l(wint_t __c, locale_t) { return ::iswpunct(__c); }
12276

123-
inline _LIBCPP_HIDE_FROM_ABI int iswspace_l(wint_t __c, locale_t) {
124-
return ::iswspace(__c);
125-
}
77+
inline _LIBCPP_HIDE_FROM_ABI_C int iswspace_l(wint_t __c, locale_t) { return ::iswspace(__c); }
12678

127-
inline _LIBCPP_HIDE_FROM_ABI int iswupper_l(wint_t __c, locale_t) {
128-
return ::iswupper(__c);
129-
}
79+
inline _LIBCPP_HIDE_FROM_ABI_C int iswupper_l(wint_t __c, locale_t) { return ::iswupper(__c); }
13080

131-
inline _LIBCPP_HIDE_FROM_ABI int iswxdigit_l(wint_t __c, locale_t) {
132-
return ::iswxdigit(__c);
133-
}
81+
inline _LIBCPP_HIDE_FROM_ABI_C int iswxdigit_l(wint_t __c, locale_t) { return ::iswxdigit(__c); }
13482

135-
inline _LIBCPP_HIDE_FROM_ABI wint_t towupper_l(wint_t __c, locale_t) {
136-
return ::towupper(__c);
137-
}
83+
inline _LIBCPP_HIDE_FROM_ABI_C wint_t towupper_l(wint_t __c, locale_t) { return ::towupper(__c); }
13884

139-
inline _LIBCPP_HIDE_FROM_ABI wint_t towlower_l(wint_t __c, locale_t) {
140-
return ::towlower(__c);
141-
}
85+
inline _LIBCPP_HIDE_FROM_ABI_C wint_t towlower_l(wint_t __c, locale_t) { return ::towlower(__c); }
14286
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
14387

144-
inline _LIBCPP_HIDE_FROM_ABI int
145-
strcoll_l(const char *__s1, const char *__s2, locale_t) {
88+
inline _LIBCPP_HIDE_FROM_ABI_C int strcoll_l(const char* __s1, const char* __s2, locale_t) {
14689
return ::strcoll(__s1, __s2);
14790
}
14891

149-
inline _LIBCPP_HIDE_FROM_ABI size_t
150-
strxfrm_l(char *__dest, const char *__src, size_t __n, locale_t) {
92+
inline _LIBCPP_HIDE_FROM_ABI_C size_t strxfrm_l(char* __dest, const char* __src, size_t __n, locale_t) {
15193
return ::strxfrm(__dest, __src, __n);
15294
}
15395

154-
inline _LIBCPP_HIDE_FROM_ABI size_t
155-
strftime_l(char *__s, size_t __max, const char *__format, const struct tm *__tm,
156-
locale_t) {
96+
inline _LIBCPP_HIDE_FROM_ABI_C size_t
97+
strftime_l(char* __s, size_t __max, const char* __format, const struct tm* __tm, locale_t) {
15798
return ::strftime(__s, __max, __format, __tm);
15899
}
159100

160101
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
161-
inline _LIBCPP_HIDE_FROM_ABI int
162-
wcscoll_l(const wchar_t *__ws1, const wchar_t *__ws2, locale_t) {
102+
inline _LIBCPP_HIDE_FROM_ABI_C int wcscoll_l(const wchar_t* __ws1, const wchar_t* __ws2, locale_t) {
163103
return ::wcscoll(__ws1, __ws2);
164104
}
165105

166-
inline _LIBCPP_HIDE_FROM_ABI size_t
167-
wcsxfrm_l(wchar_t *__dest, const wchar_t *__src, size_t __n, locale_t) {
106+
inline _LIBCPP_HIDE_FROM_ABI_C size_t wcsxfrm_l(wchar_t* __dest, const wchar_t* __src, size_t __n, locale_t) {
168107
return ::wcsxfrm(__dest, __src, __n);
169108
}
170109
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

libcxx/include/__support/xlocale/__strtonum_fallback.h

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,38 @@
2626
extern "C" {
2727
#endif
2828

29-
inline _LIBCPP_HIDE_FROM_ABI float
30-
strtof_l(const char *__nptr, char **__endptr, locale_t) {
29+
inline _LIBCPP_HIDE_FROM_ABI_C float strtof_l(const char* __nptr, char** __endptr, locale_t) {
3130
return ::strtof(__nptr, __endptr);
3231
}
3332

34-
inline _LIBCPP_HIDE_FROM_ABI double
35-
strtod_l(const char *__nptr, char **__endptr, locale_t) {
33+
inline _LIBCPP_HIDE_FROM_ABI_C double strtod_l(const char* __nptr, char** __endptr, locale_t) {
3634
return ::strtod(__nptr, __endptr);
3735
}
3836

39-
inline _LIBCPP_HIDE_FROM_ABI long double
40-
strtold_l(const char *__nptr, char **__endptr, locale_t) {
37+
inline _LIBCPP_HIDE_FROM_ABI_C long double strtold_l(const char* __nptr, char** __endptr, locale_t) {
4138
return ::strtold(__nptr, __endptr);
4239
}
4340

44-
inline _LIBCPP_HIDE_FROM_ABI long long
45-
strtoll_l(const char *__nptr, char **__endptr, int __base, locale_t) {
41+
inline _LIBCPP_HIDE_FROM_ABI_C long long strtoll_l(const char* __nptr, char** __endptr, int __base, locale_t) {
4642
return ::strtoll(__nptr, __endptr, __base);
4743
}
4844

49-
inline _LIBCPP_HIDE_FROM_ABI unsigned long long
50-
strtoull_l(const char *__nptr, char **__endptr, int __base, locale_t) {
45+
inline _LIBCPP_HIDE_FROM_ABI_C unsigned long long
46+
strtoull_l(const char* __nptr, char** __endptr, int __base, locale_t) {
5147
return ::strtoull(__nptr, __endptr, __base);
5248
}
5349

5450
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
55-
inline _LIBCPP_HIDE_FROM_ABI long long
56-
wcstoll_l(const wchar_t *__nptr, wchar_t **__endptr, int __base, locale_t) {
51+
inline _LIBCPP_HIDE_FROM_ABI_C long long wcstoll_l(const wchar_t* __nptr, wchar_t** __endptr, int __base, locale_t) {
5752
return ::wcstoll(__nptr, __endptr, __base);
5853
}
5954

60-
inline _LIBCPP_HIDE_FROM_ABI unsigned long long
61-
wcstoull_l(const wchar_t *__nptr, wchar_t **__endptr, int __base, locale_t) {
55+
inline _LIBCPP_HIDE_FROM_ABI_C unsigned long long
56+
wcstoull_l(const wchar_t* __nptr, wchar_t** __endptr, int __base, locale_t) {
6257
return ::wcstoull(__nptr, __endptr, __base);
6358
}
6459

65-
inline _LIBCPP_HIDE_FROM_ABI long double
66-
wcstold_l(const wchar_t *__nptr, wchar_t **__endptr, locale_t) {
60+
inline _LIBCPP_HIDE_FROM_ABI_C long double wcstold_l(const wchar_t* __nptr, wchar_t** __endptr, locale_t) {
6761
return ::wcstold(__nptr, __endptr);
6862
}
6963
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

0 commit comments

Comments
 (0)