| // Test end-to-end ThinLTO optimization pipeline with PGHO, that it does not |
| // interfere with other allocation instrumentation features. |
| // |
| // REQUIRES: x86-registered-target |
| // |
| // RUN: split-file %s %t |
| // RUN: llvm-profdata merge %t/memprof.yaml -o %t/use.memprofdata |
| // |
| // RUN: %clangxx --target=x86_64-linux-gnu -O2 -flto=thin -g -fmemory-profile-use=%t/use.memprofdata %t/src.cpp -c -o %t.o |
| // RUN: llvm-lto2 run %t.o -thinlto-distributed-indexes -supports-hot-cold-new -r=%t.o,main,plx -r=%t.o,_Z3foov,plx -r=%t.o,_Znam, -o %t.out |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -O1 -x ir %t.o -fthinlto-index=%t.o.thinlto.bc -mllvm -optimize-hot-cold-new -emit-llvm -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEFAULT |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -O2 -x ir %t.o -fthinlto-index=%t.o.thinlto.bc -mllvm -optimize-hot-cold-new -emit-llvm -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEFAULT |
| // |
| // RUN: %clangxx --target=x86_64-linux-gnu -O2 -flto=thin -g -fsanitize=alloc-token -falloc-token-max=32 -fmemory-profile-use=%t/use.memprofdata %t/src.cpp -c -o %t.o |
| // RUN: llvm-lto2 run %t.o -thinlto-distributed-indexes -supports-hot-cold-new -r=%t.o,main,plx -r=%t.o,_Z3foov,plx -r=%t.o,_Znam, -o %t.out |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -O1 -x ir %t.o -fsanitize=alloc-token -fthinlto-index=%t.o.thinlto.bc -mllvm -optimize-hot-cold-new -emit-llvm -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,ALLOCTOKEN |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -O2 -x ir %t.o -fsanitize=alloc-token -fthinlto-index=%t.o.thinlto.bc -mllvm -optimize-hot-cold-new -emit-llvm -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,ALLOCTOKEN |
| |
| //--- memprof.yaml |
| --- |
| HeapProfileRecords: |
| - GUID: 0x7f8d88fcc70a347b |
| AllocSites: |
| - Callstack: |
| - { Function: 0x7f8d88fcc70a347b, LineOffset: 1, Column: 10, IsInlineFrame: false } |
| - { Function: 0xdb956436e78dd5fa, LineOffset: 1, Column: 13, IsInlineFrame: false } |
| MemInfoBlock: |
| AllocCount: 1 |
| TotalAccessCount: 0 |
| MinAccessCount: 0 |
| MaxAccessCount: 0 |
| TotalSize: 10 |
| MinSize: 10 |
| MaxSize: 10 |
| AllocTimestamp: 100 |
| DeallocTimestamp: 100 |
| TotalLifetime: 100000 |
| MinLifetime: 100000 |
| MaxLifetime: 100000 |
| AllocCpuId: 0 |
| DeallocCpuId: 0 |
| NumMigratedCpu: 0 |
| NumLifetimeOverlaps: 0 |
| NumSameAllocCpu: 0 |
| NumSameDeallocCpu: 0 |
| DataTypeId: 0 |
| TotalAccessDensity: 0 |
| MinAccessDensity: 0 |
| MaxAccessDensity: 0 |
| TotalLifetimeAccessDensity: 0 |
| MinLifetimeAccessDensity: 0 |
| MaxLifetimeAccessDensity: 0 |
| AccessHistogramSize: 0 |
| AccessHistogram: 0 |
| ... |
| |
| //--- src.cpp |
| // CHECK-LABEL: define{{.*}} ptr @_Z3foov() |
| // DEFAULT: call {{.*}} ptr @_Znam12__hot_cold_t(i64 10, i8 -128) |
| // ALLOCTOKEN: call {{.*}} ptr @__alloc_token__Znam12__hot_cold_t(i64 10, i8 -128, i64 12){{.*}} !alloc_token |
| char *foo() { |
| return new char[10]; |
| } |
| |
| int main() { |
| char *a = foo(); |
| delete[] a; |
| return 0; |
| } |