Skip to content

Commit 0daf273

Browse files
[Builtins] Add memory allocation builtins (PR12543)
1 parent eaa9ef0 commit 0daf273

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

clang/include/clang/Basic/Builtins.def

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ BUILTIN(__builtin_rotateright32, "UZiUZiUZi", "nc")
529529
BUILTIN(__builtin_rotateright64, "UWiUWiUWi", "nc")
530530

531531
// Random GCC builtins
532+
BUILTIN(__builtin_calloc, "v*zz", "nF")
532533
BUILTIN(__builtin_constant_p, "i.", "nctu")
533534
BUILTIN(__builtin_classify_type, "i.", "nctu")
534535
BUILTIN(__builtin___CFStringMakeConstantString, "FC*cC*", "nc")
@@ -542,6 +543,8 @@ BUILTIN(__builtin_bcmp, "ivC*vC*z", "Fn")
542543
BUILTIN(__builtin_bcopy, "vv*v*z", "n")
543544
BUILTIN(__builtin_bzero, "vv*z", "nF")
544545
BUILTIN(__builtin_fprintf, "iP*cC*.", "Fp:1:")
546+
BUILTIN(__builtin_free, "vv*", "nF")
547+
BUILTIN(__builtin_malloc, "v*z", "nF")
545548
BUILTIN(__builtin_memchr, "v*vC*iz", "nF")
546549
BUILTIN(__builtin_memcmp, "ivC*vC*z", "nF")
547550
BUILTIN(__builtin_memcpy, "v*v*vC*z", "nF")
@@ -577,6 +580,7 @@ BUILTIN(__builtin_wmemchr, "w*wC*wz", "nF")
577580
BUILTIN(__builtin_wmemcmp, "iwC*wC*z", "nF")
578581
BUILTIN(__builtin_wmemcpy, "w*w*wC*z", "nF")
579582
BUILTIN(__builtin_wmemmove, "w*w*wC*z", "nF")
583+
BUILTIN(__builtin_realloc, "v*v*z", "nF")
580584
BUILTIN(__builtin_return_address, "v*IUi", "n")
581585
BUILTIN(__builtin_extract_return_addr, "v*v*", "n")
582586
BUILTIN(__builtin_frame_address, "v*IUi", "n")
@@ -586,8 +590,9 @@ BUILTIN(__builtin_longjmp, "vv**i", "r")
586590
BUILTIN(__builtin_unwind_init, "v", "")
587591
BUILTIN(__builtin_eh_return_data_regno, "iIi", "nc")
588592
BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:")
589-
BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
593+
BUILTIN(__builtin_sprintf, "ic*cC*.", "nFP:1:")
590594
BUILTIN(__builtin_vsnprintf, "ic*zcC*a", "nFP:2:")
595+
BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
591596
BUILTIN(__builtin_thread_pointer, "v*", "nc")
592597
BUILTIN(__builtin_launder, "v*v*", "nt")
593598
LANGBUILTIN(__builtin_is_constant_evaluated, "b", "n", CXX_LANG)

clang/test/CodeGen/builtins.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,15 @@ int main() {
9191
char s0[10], s1[] = "Hello";
9292
V(strcat, (s0, s1));
9393
V(strcmp, (s0, s1));
94+
V(strdup, (s0));
9495
V(strncat, (s0, s1, n));
96+
V(strndup, (s0, n));
9597
V(strchr, (s0, s1[0]));
9698
V(strrchr, (s0, s1[0]));
9799
V(strcpy, (s0, s1));
98100
V(strncpy, (s0, s1, n));
101+
V(sprintf, (s0, "%s", s1));
102+
V(snprintf, (s0, n, "%s", s1));
99103

100104
// Object size checking
101105
V(__memset_chk, (s0, 0, sizeof s0, n));
@@ -438,6 +442,20 @@ void test_builtin_longjmp(void **buffer) {
438442

439443
#endif
440444

445+
// CHECK-LABEL: define{{.*}} void @test_memory_builtins
446+
void test_memory_builtins(int n) {
447+
// CHECK: call i8* @malloc
448+
void * p = __builtin_malloc(n);
449+
// CHECK: call void @free
450+
__builtin_free(p);
451+
// CHECK: call i8* @calloc
452+
p = __builtin_calloc(1, n);
453+
// CHECK: call i8* @realloc
454+
p = __builtin_realloc(p, n);
455+
// CHECK: call void @free
456+
__builtin_free(p);
457+
}
458+
441459
// CHECK-LABEL: define{{.*}} i64 @test_builtin_readcyclecounter
442460
long long test_builtin_readcyclecounter() {
443461
// CHECK: call i64 @llvm.readcyclecounter()

0 commit comments

Comments
 (0)