mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 16:56:06 +00:00

CodeGen-level implementation. Instead of adding an attribute to clang's FunctionDecl, add the IR attribute directly. This means a module built with this flag is now compatible with code built without it and vice versa. This change also results in the 'noalias' attribute no longer being added to calls to operator new in the IR; it's now only added to the declaration. It also fixes a bug where we failed to add the attribute to the 'nothrow' versions (because we didn't implicitly declare them, there was no good time to inject a fake attribute). llvm-svn: 265728
50 lines
1.4 KiB
C++
50 lines
1.4 KiB
C++
// RUN: %clang_cc1 -x c++ -emit-llvm -triple=mips-unknown-linux-gnu < %s | FileCheck --check-prefix=O32 %s
|
|
// RUN: %clang_cc1 -x c++ -emit-llvm -triple=mips64-unknown-linux-gnu -target-abi n32 < %s | FileCheck --check-prefix=N32 %s
|
|
// RUN: %clang_cc1 -x c++ -emit-llvm -triple=mips64-unknown-linux-gnu -target-abi n64 < %s | FileCheck --check-prefix=N64 %s
|
|
|
|
// Test that the size_t is correct for the ABI. It's not sufficient to be the
|
|
// correct size, it must be the same type for correct name mangling.
|
|
|
|
long *alloc_long() {
|
|
long *rv = new long; // size_t is implicit in the new operator
|
|
return rv;
|
|
}
|
|
// O32-LABEL: define i32* @_Z10alloc_longv()
|
|
// O32: call i8* @_Znwj(i32 signext 4)
|
|
|
|
// N32-LABEL: define i32* @_Z10alloc_longv()
|
|
// N32: call i8* @_Znwj(i32 signext 4)
|
|
|
|
// N64-LABEL: define i64* @_Z10alloc_longv()
|
|
// N64: call i8* @_Znwm(i64 zeroext 8)
|
|
|
|
long *alloc_long_array() {
|
|
long *rv = new long[2];
|
|
return rv;
|
|
}
|
|
|
|
// O32-LABEL: define i32* @_Z16alloc_long_arrayv()
|
|
// O32: call i8* @_Znaj(i32 signext 8)
|
|
|
|
// N32-LABEL: define i32* @_Z16alloc_long_arrayv()
|
|
// N32: call i8* @_Znaj(i32 signext 8)
|
|
|
|
// N64-LABEL: define i64* @_Z16alloc_long_arrayv()
|
|
// N64: call i8* @_Znam(i64 zeroext 16)
|
|
|
|
#include <stddef.h>
|
|
|
|
void size_t_arg(size_t a) {
|
|
}
|
|
|
|
// O32-LABEL: _Z10size_t_argj
|
|
// N32-LABEL: _Z10size_t_argj
|
|
// N64-LABEL: _Z10size_t_argm
|
|
|
|
void ptrdiff_t_arg(ptrdiff_t a) {
|
|
}
|
|
|
|
// O32-LABEL: _Z13ptrdiff_t_argi
|
|
// N32-LABEL: _Z13ptrdiff_t_argi
|
|
// N64-LABEL: _Z13ptrdiff_t_argl
|