xbolva00 updated this revision to Diff 339912. xbolva00 added a comment. Updated comment for
getNewAlign() CHANGES SINCE LAST ACTION https://reviews.llvm.org/D100879/new/ https://reviews.llvm.org/D100879 Files: clang/include/clang/Basic/TargetInfo.h clang/lib/CodeGen/CGCall.cpp clang/test/CodeGen/alloc-fns-alignment.c Index: clang/test/CodeGen/alloc-fns-alignment.c =================================================================== --- /dev/null +++ clang/test/CodeGen/alloc-fns-alignment.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN8 +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-malloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-MALLOC +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-calloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-CALLOC +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-realloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-REALLOC + +typedef __SIZE_TYPE__ size_t; + +void *malloc(size_t); +void *calloc(size_t, size_t); +void *realloc(void *, size_t); + +void *malloc_test(size_t n) { + return malloc(n); +} + +void *calloc_test(size_t n) { + return calloc(1, n); +} + +void *raalloc_test(void *p, size_t n) { + return realloc(p, n); +} + +// ALIGN16: align 16 i8* @malloc +// ALIGN16: align 16 i8* @calloc +// ALIGN16: align 16 i8* @realloc +// ALIGN8: align 8 i8* @malloc +// ALIGN8: align 8 i8* @calloc +// ALIGN8: align 8 i8* @realloc +// NOBUILTIN-MALLOC: declare i8* @malloc +// NOBUILTIN-CALLOC: declare i8* @calloc +// NOBUILTIN-REALLOC: declare i8* @realloc Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2048,6 +2048,24 @@ // allows it to work on indirect virtual function calls. if (AttrOnCallSite && TargetDecl->hasAttr<NoMergeAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoMerge); + + // Add known guaranteed alignment for allocation functions. + if (unsigned BuiltinID = Fn->getBuiltinID()) { + switch (BuiltinID) { + case Builtin::BIaligned_alloc: + case Builtin::BIcalloc: + case Builtin::BImalloc: + case Builtin::BImemalign: + case Builtin::BIrealloc: + case Builtin::BIstrdup: + case Builtin::BIstrndup: + RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / + Context.getTargetInfo().getCharWidth()); + break; + default: + break; + } + } } // 'const', 'pure' and 'noalias' attributed functions are also nounwind. Index: clang/include/clang/Basic/TargetInfo.h =================================================================== --- clang/include/clang/Basic/TargetInfo.h +++ clang/include/clang/Basic/TargetInfo.h @@ -612,8 +612,8 @@ } /// Return the largest alignment for which a suitably-sized allocation with - /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned - /// pointer. + /// '::operator new(size_t)' or 'malloc' is guaranteed to produce a + /// correctly-aligned pointer. unsigned getNewAlign() const { return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign); }
Index: clang/test/CodeGen/alloc-fns-alignment.c =================================================================== --- /dev/null +++ clang/test/CodeGen/alloc-fns-alignment.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN8 +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-malloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-MALLOC +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-calloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-CALLOC +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-realloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-REALLOC + +typedef __SIZE_TYPE__ size_t; + +void *malloc(size_t); +void *calloc(size_t, size_t); +void *realloc(void *, size_t); + +void *malloc_test(size_t n) { + return malloc(n); +} + +void *calloc_test(size_t n) { + return calloc(1, n); +} + +void *raalloc_test(void *p, size_t n) { + return realloc(p, n); +} + +// ALIGN16: align 16 i8* @malloc +// ALIGN16: align 16 i8* @calloc +// ALIGN16: align 16 i8* @realloc +// ALIGN8: align 8 i8* @malloc +// ALIGN8: align 8 i8* @calloc +// ALIGN8: align 8 i8* @realloc +// NOBUILTIN-MALLOC: declare i8* @malloc +// NOBUILTIN-CALLOC: declare i8* @calloc +// NOBUILTIN-REALLOC: declare i8* @realloc Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2048,6 +2048,24 @@ // allows it to work on indirect virtual function calls. if (AttrOnCallSite && TargetDecl->hasAttr<NoMergeAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoMerge); + + // Add known guaranteed alignment for allocation functions. + if (unsigned BuiltinID = Fn->getBuiltinID()) { + switch (BuiltinID) { + case Builtin::BIaligned_alloc: + case Builtin::BIcalloc: + case Builtin::BImalloc: + case Builtin::BImemalign: + case Builtin::BIrealloc: + case Builtin::BIstrdup: + case Builtin::BIstrndup: + RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / + Context.getTargetInfo().getCharWidth()); + break; + default: + break; + } + } } // 'const', 'pure' and 'noalias' attributed functions are also nounwind. Index: clang/include/clang/Basic/TargetInfo.h =================================================================== --- clang/include/clang/Basic/TargetInfo.h +++ clang/include/clang/Basic/TargetInfo.h @@ -612,8 +612,8 @@ } /// Return the largest alignment for which a suitably-sized allocation with - /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned - /// pointer. + /// '::operator new(size_t)' or 'malloc' is guaranteed to produce a + /// correctly-aligned pointer. unsigned getNewAlign() const { return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits