Skip to content

Commit baeb85b

Browse files
committed
[Clang] Support more stdio builtins
Add more builtins for stdio functions as in GCC, along with their mutations under IEEE float128 ABI. Reviewed By: tuliom Differential Revision: https://reviews.llvm.org/D150087
1 parent fe7f620 commit baeb85b

File tree

3 files changed

+99
-18
lines changed

3 files changed

+99
-18
lines changed

clang/include/clang/Basic/Builtins.def

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,6 @@ BUILTIN(__builtin_assume_aligned, "v*vC*z.", "nctE")
557557
BUILTIN(__builtin_bcmp, "ivC*vC*z", "FnE")
558558
BUILTIN(__builtin_bcopy, "vv*v*z", "n")
559559
BUILTIN(__builtin_bzero, "vv*z", "nF")
560-
BUILTIN(__builtin_fprintf, "iP*cC*.", "Fp:1:")
561560
BUILTIN(__builtin_free, "vv*", "nF")
562561
BUILTIN(__builtin_malloc, "v*z", "nF")
563562
BUILTIN(__builtin_memchr, "v*vC*iz", "nFE")
@@ -568,7 +567,6 @@ BUILTIN(__builtin_memmove, "v*v*vC*z", "nFE")
568567
BUILTIN(__builtin_mempcpy, "v*v*vC*z", "nF")
569568
BUILTIN(__builtin_memset, "v*v*iz", "nF")
570569
BUILTIN(__builtin_memset_inline, "vv*iIz", "n")
571-
BUILTIN(__builtin_printf, "icC*.", "Fp:0:")
572570
BUILTIN(__builtin_stpcpy, "c*c*cC*", "nF")
573571
BUILTIN(__builtin_stpncpy, "c*c*cC*z", "nF")
574572
BUILTIN(__builtin_strcasecmp, "icC*cC*", "nF")
@@ -605,10 +603,20 @@ BUILTIN(__builtin_setjmp, "iv**", "j")
605603
BUILTIN(__builtin_longjmp, "vv**i", "r")
606604
BUILTIN(__builtin_unwind_init, "v", "")
607605
BUILTIN(__builtin_eh_return_data_regno, "iIi", "ncE")
608-
BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:")
609-
BUILTIN(__builtin_sprintf, "ic*cC*.", "nFP:1:")
610-
BUILTIN(__builtin_vsnprintf, "ic*zcC*a", "nFP:2:")
611-
BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
606+
BUILTIN(__builtin_fprintf, "iP*RcC*R.", "nFp:1:")
607+
BUILTIN(__builtin_printf, "icC*R.", "nFp:0:")
608+
BUILTIN(__builtin_sprintf, "ic*RcC*R.", "nFp:1:")
609+
BUILTIN(__builtin_snprintf, "ic*RzcC*R.", "nFp:2:")
610+
BUILTIN(__builtin_vprintf, "icC*Ra", "nFP:0:")
611+
BUILTIN(__builtin_vfprintf, "iP*RcC*Ra", "nFP:1:")
612+
BUILTIN(__builtin_vsprintf, "ic*RcC*Ra", "nFP:1:")
613+
BUILTIN(__builtin_vsnprintf, "ic*RzcC*Ra", "nFP:2:")
614+
BUILTIN(__builtin_fscanf, "iP*RcC*R.", "Fs:1:")
615+
BUILTIN(__builtin_scanf, "icC*R.", "Fs:0:")
616+
BUILTIN(__builtin_sscanf, "icC*RcC*R.", "Fs:1:")
617+
BUILTIN(__builtin_vfscanf, "iP*RcC*Ra", "FS:1:")
618+
BUILTIN(__builtin_vscanf, "icC*Ra", "FS:0:")
619+
BUILTIN(__builtin_vsscanf, "icC*RcC*Ra", "FS:1:")
612620
BUILTIN(__builtin_thread_pointer, "v*", "nc")
613621
BUILTIN(__builtin_launder, "v*v*", "ntE")
614622
LANGBUILTIN(__builtin_is_constant_evaluated, "b", "nE", CXX_LANG)
@@ -637,14 +645,14 @@ BUILTIN(__builtin___strlcpy_chk, "zc*cC*zz", "nF")
637645
BUILTIN(__builtin___strncat_chk, "c*c*cC*zz", "nF")
638646
BUILTIN(__builtin___strncpy_chk, "c*c*cC*zz", "nF")
639647
BUILTIN(__builtin___stpncpy_chk, "c*c*cC*zz", "nF")
640-
BUILTIN(__builtin___snprintf_chk, "ic*zizcC*.", "Fp:4:")
641-
BUILTIN(__builtin___sprintf_chk, "ic*izcC*.", "Fp:3:")
642-
BUILTIN(__builtin___vsnprintf_chk, "ic*zizcC*a", "FP:4:")
643-
BUILTIN(__builtin___vsprintf_chk, "ic*izcC*a", "FP:3:")
644-
BUILTIN(__builtin___fprintf_chk, "iP*icC*.", "Fp:2:")
645-
BUILTIN(__builtin___printf_chk, "iicC*.", "Fp:1:")
646-
BUILTIN(__builtin___vfprintf_chk, "iP*icC*a", "FP:2:")
647-
BUILTIN(__builtin___vprintf_chk, "iicC*a", "FP:1:")
648+
BUILTIN(__builtin___snprintf_chk, "ic*RzizcC*R.", "Fp:4:")
649+
BUILTIN(__builtin___sprintf_chk, "ic*RizcC*R.", "Fp:3:")
650+
BUILTIN(__builtin___vsnprintf_chk, "ic*RzizcC*Ra", "FP:4:")
651+
BUILTIN(__builtin___vsprintf_chk, "ic*RizcC*Ra", "FP:3:")
652+
BUILTIN(__builtin___fprintf_chk, "iP*RicC*R.", "Fp:2:")
653+
BUILTIN(__builtin___printf_chk, "iicC*R.", "Fp:1:")
654+
BUILTIN(__builtin___vfprintf_chk, "iP*RicC*Ra", "FP:2:")
655+
BUILTIN(__builtin___vprintf_chk, "iicC*Ra", "FP:1:")
648656

649657
BUILTIN(__builtin_unpredictable, "LiLi" , "nc")
650658
BUILTIN(__builtin_expect, "LiLiLi" , "ncE")

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,29 @@ llvm::Constant *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
9999

100100
// TODO: This list should be expanded or refactored after all GCC-compatible
101101
// std libcall builtins are implemented.
102-
static SmallDenseMap<unsigned, StringRef, 8> F128Builtins{
102+
static SmallDenseMap<unsigned, StringRef, 64> F128Builtins{
103+
{Builtin::BI__builtin___fprintf_chk, "__fprintf_chkieee128"},
104+
{Builtin::BI__builtin___printf_chk, "__printf_chkieee128"},
105+
{Builtin::BI__builtin___snprintf_chk, "__snprintf_chkieee128"},
106+
{Builtin::BI__builtin___sprintf_chk, "__sprintf_chkieee128"},
107+
{Builtin::BI__builtin___vfprintf_chk, "__vfprintf_chkieee128"},
108+
{Builtin::BI__builtin___vprintf_chk, "__vprintf_chkieee128"},
109+
{Builtin::BI__builtin___vsnprintf_chk, "__vsnprintf_chkieee128"},
110+
{Builtin::BI__builtin___vsprintf_chk, "__vsprintf_chkieee128"},
111+
{Builtin::BI__builtin_fprintf, "__fprintfieee128"},
103112
{Builtin::BI__builtin_printf, "__printfieee128"},
113+
{Builtin::BI__builtin_snprintf, "__snprintfieee128"},
114+
{Builtin::BI__builtin_sprintf, "__sprintfieee128"},
115+
{Builtin::BI__builtin_vfprintf, "__vfprintfieee128"},
116+
{Builtin::BI__builtin_vprintf, "__vprintfieee128"},
104117
{Builtin::BI__builtin_vsnprintf, "__vsnprintfieee128"},
105118
{Builtin::BI__builtin_vsprintf, "__vsprintfieee128"},
106-
{Builtin::BI__builtin_sprintf, "__sprintfieee128"},
107-
{Builtin::BI__builtin_snprintf, "__snprintfieee128"},
108-
{Builtin::BI__builtin_fprintf, "__fprintfieee128"},
119+
{Builtin::BI__builtin_fscanf, "__fscanfieee128"},
120+
{Builtin::BI__builtin_scanf, "__scanfieee128"},
121+
{Builtin::BI__builtin_sscanf, "__sscanfieee128"},
122+
{Builtin::BI__builtin_vfscanf, "__vfscanfieee128"},
123+
{Builtin::BI__builtin_vscanf, "__vscanfieee128"},
124+
{Builtin::BI__builtin_vsscanf, "__vsscanfieee128"},
109125
{Builtin::BI__builtin_nexttowardf128, "__nexttowardieee128"},
110126
};
111127

clang/test/CodeGen/PowerPC/ppc64-f128-builtins.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,63 @@ void test_snprintf(void) {
5252
__builtin_snprintf(buf, 20, "%.Lf", x);
5353
}
5454

55+
// IEEE128-LABEL: define dso_local void @test_scanf
56+
// IEEE128: call signext i32 (ptr, ...) @__scanfieee128
57+
// PPC128-LABEL: define dso_local void @test_scanf
58+
// PPC128: call signext i32 (ptr, ...) @scanf
59+
void test_scanf(int *x) {
60+
__builtin_scanf("%d", x);
61+
}
62+
63+
// IEEE128-LABEL: define dso_local void @test_sscanf
64+
// IEEE128: call signext i32 (ptr, ptr, ...) @__sscanfieee128
65+
// PPC128-LABEL: define dso_local void @test_sscanf
66+
// PPC128: call signext i32 (ptr, ptr, ...) @sscanf
67+
void test_sscanf(int *x) {
68+
__builtin_sscanf(buf, "%d", x);
69+
}
70+
71+
// IEEE128-LABEL: define dso_local void @test_vprintf
72+
// IEEE128: call signext i32 @__vprintfieee128
73+
// PPC128-LABEL: define dso_local void @test_vprintf
74+
// PPC128: call signext i32 @vprintf
75+
void test_vprintf(const char *fmt, ...) {
76+
__builtin_va_list args;
77+
__builtin_va_start(args, fmt);
78+
__builtin_vprintf(fmt, args);
79+
__builtin_va_end(args);
80+
}
81+
82+
// IEEE128-LABEL: define dso_local void @test_vscanf
83+
// IEEE128: call signext i32 @__vscanfieee128
84+
// PPC128-LABEL: define dso_local void @test_vscanf
85+
// PPC128: call signext i32 @vscanf
86+
void test_vscanf(const char *fmt, ...) {
87+
__builtin_va_list args;
88+
__builtin_va_start(args, fmt);
89+
__builtin_vscanf(fmt, args);
90+
__builtin_va_end(args);
91+
}
92+
93+
// IEEE128-LABEL: define dso_local void @test_vsscanf
94+
// IEEE128: call signext i32 @__vsscanfieee128
95+
// PPC128-LABEL: define dso_local void @test_vsscanf
96+
// PPC128: call signext i32 @vsscanf
97+
void test_vsscanf(const char *fmt, ...) {
98+
__builtin_va_list args;
99+
__builtin_va_start(args, fmt);
100+
__builtin_vsscanf(buf, fmt, args);
101+
__builtin_va_end(args);
102+
}
103+
104+
// IEEE128-LABEL: define dso_local void @test_snprintf_chk
105+
// IEEE128: call signext i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chkieee128
106+
// PPC128-LABEL: define dso_local void @test_snprintf_chk
107+
// PPC128: call signext i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk
108+
void test_snprintf_chk(long double x) {
109+
__builtin___snprintf_chk(buf, 20, 1, 20, "%.Lf", x);
110+
}
111+
55112
// GLIBC has special handling of 'nexttoward'
56113

57114
// IEEE128-LABEL: define dso_local fp128 @test_nexttoward

0 commit comments

Comments
 (0)