mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 03:25:23 +00:00
c++ new operators are not malloc-like functions because they do not return uninitialized memory.
Users may overide new-operators and implement any function that they like. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179071 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -52,14 +52,6 @@ struct AllocFnsTy {
|
|||||||
static const AllocFnsTy AllocationFnData[] = {
|
static const AllocFnsTy AllocationFnData[] = {
|
||||||
{LibFunc::malloc, MallocLike, 1, 0, -1},
|
{LibFunc::malloc, MallocLike, 1, 0, -1},
|
||||||
{LibFunc::valloc, MallocLike, 1, 0, -1},
|
{LibFunc::valloc, MallocLike, 1, 0, -1},
|
||||||
{LibFunc::Znwj, MallocLike, 1, 0, -1}, // new(unsigned int)
|
|
||||||
{LibFunc::ZnwjRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new(unsigned int, nothrow)
|
|
||||||
{LibFunc::Znwm, MallocLike, 1, 0, -1}, // new(unsigned long)
|
|
||||||
{LibFunc::ZnwmRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new(unsigned long, nothrow)
|
|
||||||
{LibFunc::Znaj, MallocLike, 1, 0, -1}, // new[](unsigned int)
|
|
||||||
{LibFunc::ZnajRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned int, nothrow)
|
|
||||||
{LibFunc::Znam, MallocLike, 1, 0, -1}, // new[](unsigned long)
|
|
||||||
{LibFunc::ZnamRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned long, nothrow)
|
|
||||||
{LibFunc::posix_memalign, MallocLike, 3, 2, -1},
|
{LibFunc::posix_memalign, MallocLike, 3, 2, -1},
|
||||||
{LibFunc::calloc, CallocLike, 2, 0, 1},
|
{LibFunc::calloc, CallocLike, 2, 0, 1},
|
||||||
{LibFunc::realloc, ReallocLike, 2, 1, -1},
|
{LibFunc::realloc, ReallocLike, 2, 1, -1},
|
||||||
|
20
test/Transforms/GVN/newoperator.ll
Normal file
20
test/Transforms/GVN/newoperator.ll
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
|
||||||
|
|
||||||
|
; We can't remove the load because new operators are overideable and can return non-undefined memory.
|
||||||
|
;CHECK: main
|
||||||
|
;CHECK: load
|
||||||
|
;CHECK: ret
|
||||||
|
define i32 @main(i32 %argc, i8** nocapture %argv) ssp uwtable {
|
||||||
|
%1 = tail call noalias i8* @_Znam(i64 800)
|
||||||
|
%2 = bitcast i8* %1 to i32**
|
||||||
|
%3 = load i32** %2, align 8, !tbaa !0
|
||||||
|
%4 = icmp eq i32* %3, null
|
||||||
|
%5 = zext i1 %4 to i32
|
||||||
|
ret i32 %5
|
||||||
|
}
|
||||||
|
|
||||||
|
declare noalias i8* @_Znam(i64)
|
||||||
|
|
||||||
|
!0 = metadata !{metadata !"any pointer", metadata !1}
|
||||||
|
!1 = metadata !{metadata !"omnipotent char", metadata !2}
|
||||||
|
!2 = metadata !{metadata !"Simple C/C++ TBAA"}
|
@@ -47,19 +47,3 @@ lpad:
|
|||||||
unreachable
|
unreachable
|
||||||
}
|
}
|
||||||
|
|
||||||
; CHECK: @f3
|
|
||||||
define void @f3() nounwind uwtable ssp {
|
|
||||||
; CHECK: invoke void @llvm.donothing()
|
|
||||||
%call = invoke noalias i8* @_Znwm(i64 13)
|
|
||||||
to label %invoke.cont unwind label %lpad
|
|
||||||
|
|
||||||
invoke.cont:
|
|
||||||
ret void
|
|
||||||
|
|
||||||
lpad:
|
|
||||||
%1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
|
||||||
filter [0 x i8*] zeroinitializer
|
|
||||||
%2 = extractvalue { i8*, i32 } %1, 0
|
|
||||||
tail call void @__cxa_call_unexpected(i8* %2) noreturn nounwind
|
|
||||||
unreachable
|
|
||||||
}
|
|
||||||
|
@@ -25,7 +25,7 @@ entry:
|
|||||||
to label %invoke.cont unwind label %lpad
|
to label %invoke.cont unwind label %lpad
|
||||||
|
|
||||||
invoke.cont:
|
invoke.cont:
|
||||||
; CHECK: ret i64 13
|
; CHECK: ret i64 %0
|
||||||
store i8* %call, i8** %esc
|
store i8* %call, i8** %esc
|
||||||
%0 = tail call i64 @llvm.objectsize.i64(i8* %call, i1 false)
|
%0 = tail call i64 @llvm.objectsize.i64(i8* %call, i1 false)
|
||||||
ret i64 %0
|
ret i64 %0
|
||||||
|
Reference in New Issue
Block a user