mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04: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
32 lines
943 B
C++
32 lines
943 B
C++
// RUN: %clang_cc1 -triple i686-pc-linux-gnu -emit-llvm -o %t-1.ll %s
|
|
// RUN: FileCheck -check-prefix SANE --input-file=%t-1.ll %s
|
|
// RUN: %clang_cc1 -triple i686-pc-linux-gnu -emit-llvm -fno-assume-sane-operator-new -o %t-2.ll %s
|
|
// RUN: FileCheck -check-prefix SANENOT --input-file=%t-2.ll %s
|
|
|
|
|
|
class teste {
|
|
int A;
|
|
public:
|
|
teste() : A(2) {}
|
|
};
|
|
|
|
void f1() {
|
|
// SANE: declare noalias i8* @_Znwj(
|
|
// SANENOT: declare i8* @_Znwj(
|
|
new teste();
|
|
}
|
|
|
|
// rdar://5739832 - operator new should check for overflow in multiply.
|
|
void *f2(long N) {
|
|
return new int[N];
|
|
|
|
// SANE: [[UWO:%.*]] = call {{.*}} @llvm.umul.with.overflow
|
|
// SANE-NEXT: [[OVER:%.*]] = extractvalue {{.*}} [[UWO]], 1
|
|
// SANE-NEXT: [[SUM:%.*]] = extractvalue {{.*}} [[UWO]], 0
|
|
// SANE-NEXT: [[RESULT:%.*]] = select i1 [[OVER]], i32 -1, i32 [[SUM]]
|
|
// SANE-NEXT: call i8* @_Znaj(i32 [[RESULT]])
|
|
}
|
|
|
|
// SANE: declare noalias i8* @_Znaj(
|
|
// SANENOT: declare i8* @_Znaj(
|