File tree Expand file tree Collapse file tree 3 files changed +55
-2
lines changed Expand file tree Collapse file tree 3 files changed +55
-2
lines changed Original file line number Diff line number Diff line change @@ -612,8 +612,8 @@ class TargetInfo : public virtual TransferrableTargetInfo,
612
612
}
613
613
614
614
// / Return the largest alignment for which a suitably-sized allocation with
615
- // / '::operator new(size_t)' is guaranteed to produce a correctly-aligned
616
- // / pointer.
615
+ // / '::operator new(size_t)' or 'malloc' is guaranteed to produce a
616
+ // / correctly-aligned pointer.
617
617
unsigned getNewAlign () const {
618
618
return NewAlign ? NewAlign : std::max (LongDoubleAlign, LongLongAlign);
619
619
}
Original file line number Diff line number Diff line change @@ -2048,6 +2048,24 @@ void CodeGenModule::ConstructAttributeList(
2048
2048
// allows it to work on indirect virtual function calls.
2049
2049
if (AttrOnCallSite && TargetDecl->hasAttr <NoMergeAttr>())
2050
2050
FuncAttrs.addAttribute (llvm::Attribute::NoMerge);
2051
+
2052
+ // Add known guaranteed alignment for allocation functions.
2053
+ if (unsigned BuiltinID = Fn->getBuiltinID ()) {
2054
+ switch (BuiltinID) {
2055
+ case Builtin::BIaligned_alloc:
2056
+ case Builtin::BIcalloc:
2057
+ case Builtin::BImalloc:
2058
+ case Builtin::BImemalign:
2059
+ case Builtin::BIrealloc:
2060
+ case Builtin::BIstrdup:
2061
+ case Builtin::BIstrndup:
2062
+ RetAttrs.addAlignmentAttr (Context.getTargetInfo ().getNewAlign () /
2063
+ Context.getTargetInfo ().getCharWidth ());
2064
+ break ;
2065
+ default :
2066
+ break ;
2067
+ }
2068
+ }
2051
2069
}
2052
2070
2053
2071
// 'const', 'pure' and 'noalias' attributed functions are also nounwind.
Original file line number Diff line number Diff line change
1
+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16
2
+ // RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16
3
+ // RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16
4
+ // RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN8
5
+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-malloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-MALLOC
6
+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-calloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-CALLOC
7
+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-realloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-REALLOC
8
+
9
+ typedef __SIZE_TYPE__ size_t ;
10
+
11
+ void * malloc (size_t );
12
+ void * calloc (size_t , size_t );
13
+ void * realloc (void * , size_t );
14
+
15
+ void * malloc_test (size_t n ) {
16
+ return malloc (n );
17
+ }
18
+
19
+ void * calloc_test (size_t n ) {
20
+ return calloc (1 , n );
21
+ }
22
+
23
+ void * raalloc_test (void * p , size_t n ) {
24
+ return realloc (p , n );
25
+ }
26
+
27
+ // ALIGN16: align 16 i8* @malloc
28
+ // ALIGN16: align 16 i8* @calloc
29
+ // ALIGN16: align 16 i8* @realloc
30
+ // ALIGN8: align 8 i8* @malloc
31
+ // ALIGN8: align 8 i8* @calloc
32
+ // ALIGN8: align 8 i8* @realloc
33
+ // NOBUILTIN-MALLOC: declare i8* @malloc
34
+ // NOBUILTIN-CALLOC: declare i8* @calloc
35
+ // NOBUILTIN-REALLOC: declare i8* @realloc
You can’t perform that action at this time.
0 commit comments