This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG040c1b49d7a7: Move EntryExitInstrumentation pass location 
(authored by aeubanks).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97608/new/

https://reviews.llvm.org/D97608

Files:
  clang/lib/CodeGen/BackendUtil.cpp
  clang/test/CodeGen/X86/x86_64-instrument-functions.c
  clang/test/CodeGen/mcount.c
  clang/test/Frontend/gnu-mcount.c
  llvm/include/llvm/Transforms/Utils/EntryExitInstrumenter.h
  llvm/lib/CodeGen/TargetPassConfig.cpp
  llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
  llvm/test/CodeGen/AArch64/O0-pipeline.ll
  llvm/test/CodeGen/AArch64/O3-pipeline.ll
  llvm/test/CodeGen/AMDGPU/opt-pipeline.ll
  llvm/test/CodeGen/ARM/O3-pipeline.ll
  llvm/test/CodeGen/ARM/gnu_mcount_nc.ll
  llvm/test/CodeGen/Mips/long-call-mcount.ll
  llvm/test/CodeGen/Mips/mcount.ll
  llvm/test/CodeGen/PowerPC/mcount-insertion.ll
  llvm/test/CodeGen/X86/O0-pipeline.ll
  llvm/test/CodeGen/X86/musttail-inalloca.ll
  llvm/test/CodeGen/X86/opt-pipeline.ll
  llvm/test/Other/opt-O0-pipeline-enable-matrix.ll
  llvm/test/Other/opt-O0-pipeline.ll
  llvm/test/Other/opt-O2-pipeline.ll
  llvm/test/Other/opt-O3-pipeline-enable-matrix.ll
  llvm/test/Other/opt-O3-pipeline.ll
  llvm/test/Other/opt-Os-pipeline.ll

Index: llvm/test/Other/opt-Os-pipeline.ll
===================================================================
--- llvm/test/Other/opt-Os-pipeline.ll
+++ llvm/test/Other/opt-Os-pipeline.ll
@@ -12,7 +12,6 @@
 ; CHECK-NEXT:     Module Verifier
 ; CHECK-EXT:      Good Bye World Pass
 ; CHECK-NOEXT-NOT:      Good Bye World Pass
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT:     Simplify the CFG
 ; CHECK-NEXT:     Dominator Tree Construction
 ; CHECK-NEXT:     SROA
Index: llvm/test/Other/opt-O3-pipeline.ll
===================================================================
--- llvm/test/Other/opt-O3-pipeline.ll
+++ llvm/test/Other/opt-O3-pipeline.ll
@@ -12,7 +12,6 @@
 ; CHECK-NEXT:     Module Verifier
 ; CHECK-EXT:      Good Bye World Pass
 ; CHECK-NOEXT-NOT:      Good Bye World Pass
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT:     Simplify the CFG
 ; CHECK-NEXT:     Dominator Tree Construction
 ; CHECK-NEXT:     SROA
Index: llvm/test/Other/opt-O3-pipeline-enable-matrix.ll
===================================================================
--- llvm/test/Other/opt-O3-pipeline-enable-matrix.ll
+++ llvm/test/Other/opt-O3-pipeline-enable-matrix.ll
@@ -12,7 +12,6 @@
 ; CHECK-NEXT:     Module Verifier
 ; CHECK-EXT:      Good Bye World Pass
 ; CHECK-NOEXT-NOT:      Good Bye World Pass
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT:     Simplify the CFG
 ; CHECK-NEXT:     Dominator Tree Construction
 ; CHECK-NEXT:     SROA
Index: llvm/test/Other/opt-O2-pipeline.ll
===================================================================
--- llvm/test/Other/opt-O2-pipeline.ll
+++ llvm/test/Other/opt-O2-pipeline.ll
@@ -12,7 +12,6 @@
 ; CHECK-NEXT:     Module Verifier
 ; CHECK-EXT:      Good Bye World Pass
 ; CHECK-NOEXT-NOT:      Good Bye World Pass
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT:     Simplify the CFG
 ; CHECK-NEXT:     Dominator Tree Construction
 ; CHECK-NEXT:     SROA
Index: llvm/test/Other/opt-O0-pipeline.ll
===================================================================
--- llvm/test/Other/opt-O0-pipeline.ll
+++ llvm/test/Other/opt-O0-pipeline.ll
@@ -10,7 +10,6 @@
 ; CHECK-NEXT:   FunctionPass Manager
 ; CHECK-NEXT:     Module Verifier
 ; CHECK-EXT:     Good Bye World Pass
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT: Pass Arguments:
 ; CHECK-NEXT: Target Library Information
 ; CHECK-NEXT: Target Transform Information
Index: llvm/test/Other/opt-O0-pipeline-enable-matrix.ll
===================================================================
--- llvm/test/Other/opt-O0-pipeline-enable-matrix.ll
+++ llvm/test/Other/opt-O0-pipeline-enable-matrix.ll
@@ -6,7 +6,6 @@
 ; CHECK-NEXT: Target Transform Information
 ; CHECK-NEXT:   FunctionPass Manager
 ; CHECK-NEXT:     Module Verifier
-; CHECK-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; CHECK-NEXT:     Lower the matrix intrinsics (minimal)
 
 
Index: llvm/test/CodeGen/X86/opt-pipeline.ll
===================================================================
--- llvm/test/CodeGen/X86/opt-pipeline.ll
+++ llvm/test/CodeGen/X86/opt-pipeline.ll
@@ -53,7 +53,6 @@
 ; CHECK-NEXT:       Constant Hoisting
 ; CHECK-NEXT:       Replace intrinsics with calls to vector library
 ; CHECK-NEXT:       Partially inline calls to library functions
-; CHECK-NEXT:       Instrument function entry/exit with calls to e.g. mcount() (post inlining)
 ; CHECK-NEXT:       Scalarize Masked Memory Intrinsics
 ; CHECK-NEXT:       Expand reduction intrinsics
 ; CHECK-NEXT:       Interleaved Access Pass
Index: llvm/test/CodeGen/X86/musttail-inalloca.ll
===================================================================
--- llvm/test/CodeGen/X86/musttail-inalloca.ll
+++ llvm/test/CodeGen/X86/musttail-inalloca.ll
@@ -13,6 +13,7 @@
 
 declare dso_local x86_thiscallcc void @methodWithVtorDisp(i8* nocapture readonly, <{ %struct.Args }>* inalloca)
 
+; Function Attrs: nounwind optsize
 define dso_local x86_thiscallcc void @methodWithVtorDisp_thunk(i8* %0, <{ %struct.Args }>* inalloca %1) #0 {
 ; CHECK-LABEL: methodWithVtorDisp_thunk:
 ; CHECK:       # %bb.0:
@@ -31,8 +32,16 @@
   %5 = load i32, i32* %4, align 4
   %6 = sub i32 0, %5
   %7 = getelementptr i8, i8* %0, i32 %6
+  %8 = call i8* @llvm.returnaddress(i32 0)
+  call void @__cyg_profile_func_exit(i8* bitcast (void (i8*, <{ %struct.Args }>*)* @methodWithVtorDisp_thunk to i8*), i8* %8)
   musttail call x86_thiscallcc void @methodWithVtorDisp(i8* %7, <{ %struct.Args }>* inalloca nonnull %1)
   ret void
 }
 
-attributes #0 = { nounwind optsize "instrument-function-exit-inlined"="__cyg_profile_func_exit"  }
+declare void @__cyg_profile_func_exit(i8*, i8*)
+
+; Function Attrs: nofree nosync nounwind readnone willreturn
+declare i8* @llvm.returnaddress(i32 immarg) #1
+
+attributes #0 = { nounwind optsize }
+attributes #1 = { nofree nosync nounwind readnone willreturn }
Index: llvm/test/CodeGen/X86/O0-pipeline.ll
===================================================================
--- llvm/test/CodeGen/X86/O0-pipeline.ll
+++ llvm/test/CodeGen/X86/O0-pipeline.ll
@@ -24,7 +24,6 @@
 ; CHECK-NEXT:       Shadow Stack GC Lowering
 ; CHECK-NEXT:       Lower constant intrinsics
 ; CHECK-NEXT:       Remove unreachable blocks from the CFG
-; CHECK-NEXT:       Instrument function entry/exit with calls to e.g. mcount() (post inlining)
 ; CHECK-NEXT:       Scalarize Masked Memory Intrinsics
 ; CHECK-NEXT:       Expand reduction intrinsics
 ; CHECK-NEXT:       Expand indirectbr instructions
Index: llvm/test/CodeGen/PowerPC/mcount-insertion.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/mcount-insertion.ll
+++ llvm/test/CodeGen/PowerPC/mcount-insertion.ll
@@ -1,4 +1,4 @@
-; RUN: opt -ee-instrument < %s | opt -inline | llc -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s
+; RUN: opt -ee-instrument < %s | opt -inline | opt -post-inline-ee-instrument | llc -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s
 
 ; The run-line mimics how Clang might run the instrumentation passes.
 
Index: llvm/test/CodeGen/Mips/mcount.ll
===================================================================
--- llvm/test/CodeGen/Mips/mcount.ll
+++ llvm/test/CodeGen/Mips/mcount.ll
@@ -15,8 +15,7 @@
 
 ; Test that checks ABI for _mcount calls.
 
-; Function Attrs: noinline nounwind optnone
-define void @foo() #0 {
+define void @foo() {
 ; MIPS32-LABEL: foo:
 ; MIPS32:       # %bb.0: # %entry
 ; MIPS32-NEXT:    addiu $sp, $sp, -24
@@ -117,7 +116,8 @@
 ; MIPS32-MM-PIC-NEXT:    jr $ra
 ; MIPS32-MM-PIC-NEXT:    addiu $sp, $sp, 24
 entry:
+  call void @_mcount()
   ret void
 }
 
-attributes #0 = { "instrument-function-entry-inlined"="_mcount" }
+declare void @_mcount()
Index: llvm/test/CodeGen/Mips/long-call-mcount.ll
===================================================================
--- llvm/test/CodeGen/Mips/long-call-mcount.ll
+++ llvm/test/CodeGen/Mips/long-call-mcount.ll
@@ -4,9 +4,9 @@
 ; RUN: llc -march=mips -target-abi o32 --mattr=-long-calls,+noabicalls < %s \
 ; RUN:   -mips-jalr-reloc=false | FileCheck -check-prefixes=CHECK,SHORT %s
 
-; Function Attrs: noinline nounwind optnone
-define void @foo() #0 {
+define void @foo() {
 entry:
+  call void @_mcount()
   ret void
 
 ; CHECK-LABEL: foo
@@ -16,4 +16,4 @@
 ; SHORT:         jal     _mcount
 }
 
-attributes #0 = { "instrument-function-entry-inlined"="_mcount" }
+declare void @_mcount()
Index: llvm/test/CodeGen/ARM/gnu_mcount_nc.ll
===================================================================
--- llvm/test/CodeGen/ARM/gnu_mcount_nc.ll
+++ llvm/test/CodeGen/ARM/gnu_mcount_nc.ll
@@ -18,6 +18,7 @@
 ; CHECK-THUMB-FAST-ISEL-NEXT:   bl      __gnu_mcount_nc
 ; CHECK-THUMB-GLOBAL-ISEL:      push    {lr}
 ; CHECK-THUMB-GLOBAL-ISEL-NEXT: bl      __gnu_mcount_nc
+  call void @llvm.arm.gnu.eabi.mcount()
   ret void
 }
 
@@ -34,8 +35,12 @@
 ; CHECK-THUMB-FAST-ISEL-NEXT:   bl      __gnu_mcount_nc
 ; CHECK-THUMB-GLOBAL-ISEL:      push    {lr}
 ; CHECK-THUMB-GLOBAL-ISEL-NEXT: bl      __gnu_mcount_nc
+  call void @llvm.arm.gnu.eabi.mcount()
   call void @callee()
   ret void
 }
 
-attributes #0 = { nofree nounwind "instrument-function-entry-inlined"="llvm.arm.gnu.eabi.mcount" }
+declare void @llvm.arm.gnu.eabi.mcount() #1
+
+attributes #0 = { nofree nounwind }
+attributes #1 = { nounwind }
Index: llvm/test/CodeGen/ARM/O3-pipeline.ll
===================================================================
--- llvm/test/CodeGen/ARM/O3-pipeline.ll
+++ llvm/test/CodeGen/ARM/O3-pipeline.ll
@@ -36,7 +36,6 @@
 ; CHECK-NEXT:      Constant Hoisting
 ; CHECK-NEXT:      Replace intrinsics with calls to vector library
 ; CHECK-NEXT:      Partially inline calls to library functions
-; CHECK-NEXT:      Instrument function entry/exit with calls to e.g. mcount() (post inlining)
 ; CHECK-NEXT:      Scalarize Masked Memory Intrinsics
 ; CHECK-NEXT:      Expand reduction intrinsics
 ; CHECK-NEXT:      Natural Loop Information
Index: llvm/test/CodeGen/AMDGPU/opt-pipeline.ll
===================================================================
--- llvm/test/CodeGen/AMDGPU/opt-pipeline.ll
+++ llvm/test/CodeGen/AMDGPU/opt-pipeline.ll
@@ -10,7 +10,6 @@
 ; GCN-O0-NEXT:   FunctionPass Manager
 ; GCN-O0-NEXT:     Early propagate attributes from kernels to functions
 ; GCN-O0-NEXT:     Replace builtin math calls with that native versions.
-; GCN-O0-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 
 ; GCN-O0-NEXT: Pass Arguments:
 ; GCN-O0-NEXT: Target Library Information
@@ -42,7 +41,6 @@
 ; GCN-O1-NEXT:     Basic Alias Analysis (stateless AA impl)
 ; GCN-O1-NEXT:     Function Alias Analysis Results
 ; GCN-O1-NEXT:     Simplify well-known AMD library calls
-; GCN-O1-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; GCN-O1-NEXT:     Simplify the CFG
 ; GCN-O1-NEXT:     Dominator Tree Construction
 ; GCN-O1-NEXT:     SROA
@@ -352,7 +350,6 @@
 ; GCN-O2-NEXT:     Basic Alias Analysis (stateless AA impl)
 ; GCN-O2-NEXT:     Function Alias Analysis Results
 ; GCN-O2-NEXT:     Simplify well-known AMD library calls
-; GCN-O2-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; GCN-O2-NEXT:     Simplify the CFG
 ; GCN-O2-NEXT:     Dominator Tree Construction
 ; GCN-O2-NEXT:     SROA
@@ -707,7 +704,6 @@
 ; GCN-O3-NEXT:     Basic Alias Analysis (stateless AA impl)
 ; GCN-O3-NEXT:     Function Alias Analysis Results
 ; GCN-O3-NEXT:     Simplify well-known AMD library calls
-; GCN-O3-NEXT:     Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
 ; GCN-O3-NEXT:     Simplify the CFG
 ; GCN-O3-NEXT:     Dominator Tree Construction
 ; GCN-O3-NEXT:     SROA
Index: llvm/test/CodeGen/AArch64/O3-pipeline.ll
===================================================================
--- llvm/test/CodeGen/AArch64/O3-pipeline.ll
+++ llvm/test/CodeGen/AArch64/O3-pipeline.ll
@@ -56,7 +56,6 @@
 ; CHECK-NEXT:       Constant Hoisting
 ; CHECK-NEXT:       Replace intrinsics with calls to vector library
 ; CHECK-NEXT:       Partially inline calls to library functions
-; CHECK-NEXT:       Instrument function entry/exit with calls to e.g. mcount() (post inlining)
 ; CHECK-NEXT:       Scalarize Masked Memory Intrinsics
 ; CHECK-NEXT:       Expand reduction intrinsics
 ; CHECK-NEXT:     Stack Safety Analysis
Index: llvm/test/CodeGen/AArch64/O0-pipeline.ll
===================================================================
--- llvm/test/CodeGen/AArch64/O0-pipeline.ll
+++ llvm/test/CodeGen/AArch64/O0-pipeline.ll
@@ -21,7 +21,6 @@
 ; CHECK-NEXT:       Shadow Stack GC Lowering
 ; CHECK-NEXT:       Lower constant intrinsics
 ; CHECK-NEXT:       Remove unreachable blocks from the CFG
-; CHECK-NEXT:       Instrument function entry/exit with calls to e.g. mcount() (post inlining)
 ; CHECK-NEXT:       Scalarize Masked Memory Intrinsics
 ; CHECK-NEXT:       Expand reduction intrinsics
 ; CHECK-NEXT:       AArch64 Stack Tagging
Index: llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
===================================================================
--- llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
+++ llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
@@ -300,7 +300,6 @@
 void PassManagerBuilder::populateFunctionPassManager(
     legacy::FunctionPassManager &FPM) {
   addExtensionsToPM(EP_EarlyAsPossible, FPM);
-  FPM.add(createEntryExitInstrumenterPass());
 
   // Add LibraryInfo if we have some.
   if (LibraryInfo)
Index: llvm/lib/CodeGen/TargetPassConfig.cpp
===================================================================
--- llvm/lib/CodeGen/TargetPassConfig.cpp
+++ llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -864,9 +864,6 @@
   if (getOptLevel() != CodeGenOpt::None && !DisablePartialLibcallInlining)
     addPass(createPartiallyInlineLibCallsPass());
 
-  // Instrument function entry and exit, e.g. with calls to mcount().
-  addPass(createPostInlineEntryExitInstrumenterPass());
-
   // Add scalarization of target's unsupported masked memory intrinsics pass.
   // the unsupported intrinsic will be replaced with a chain of basic blocks,
   // that stores/loads element one-by-one if the appropriate mask bit is set.
Index: llvm/include/llvm/Transforms/Utils/EntryExitInstrumenter.h
===================================================================
--- llvm/include/llvm/Transforms/Utils/EntryExitInstrumenter.h
+++ llvm/include/llvm/Transforms/Utils/EntryExitInstrumenter.h
@@ -28,6 +28,8 @@
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
 
   bool PostInlining;
+
+  static bool isRequired() { return true; }
 };
 
 } // namespace llvm
Index: clang/test/Frontend/gnu-mcount.c
===================================================================
--- clang/test/Frontend/gnu-mcount.c
+++ clang/test/Frontend/gnu-mcount.c
@@ -43,10 +43,10 @@
 
 // CHECK-LABEL: f
 // TODO: add profiling support for arm-baremetal
-// UNSUPPORTED-NOT: "instrument-function-entry-inlined"=
-// CHECK-ARM-EABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01mcount"{{.*}} }
-// MCOUNT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"
-// UNDER: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01_mcount"
-// UNDER_UNDER: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="__mcount"
-// CHECK-ARM64-EABI-FREEBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"=".mcount"{{.*}} }
-// CHECK-ARM-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="llvm.arm.gnu.eabi.mcount"{{.*}} }
+// UNSUPPORTED-NOT: call void
+// CHECK-ARM-EABI: call void @"\01mcount"()
+// MCOUNT: call void @mcount()
+// UNDER: call void @"\01_mcount"()
+// UNDER_UNDER: call void @__mcount()
+// CHECK-ARM64-EABI-FREEBSD: call void @.mcount()
+// CHECK-ARM-EABI-MEABI-GNU: call void @llvm.arm.gnu.eabi.mcount()
Index: clang/test/CodeGen/mcount.c
===================================================================
--- clang/test/CodeGen/mcount.c
+++ clang/test/CodeGen/mcount.c
@@ -35,11 +35,17 @@
   return no_instrument();
 }
 
-// CHECK: attributes #0 = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
-// CHECK: attributes #1 = { {{.*}} }
-// CHECK-PREFIXED: attributes #0 = { {{.*}}"instrument-function-entry-inlined"="_mcount"{{.*}} }
-// CHECK-PREFIXED: attributes #1 = { {{.*}} }
-// CHECK-DOUBLE-PREFIXED: attributes #0 = { {{.*}}"instrument-function-entry-inlined"="__mcount"{{.*}} }
-// CHECK-DOUBLE-PREFIXED: attributes #1 = { {{.*}} }
-// NO-MCOUNT-NOT: attributes #{{[0-9]}} = { {{.*}}"instrument-function-entry-inlined"={{.*}} }
-// NO-MCOUNT1-NOT: attributes #1 = { {{.*}}"instrument-function-entry-inlined"={{.*}} }
+// CHECK: call void @mcount
+// CHECK: call void @mcount
+// CHECK: call void @mcount
+// CHECK-NOT: call void @mcount
+// CHECK-PREFIXED: call void @_mcount
+// CHECK-PREFIXED: call void @_mcount
+// CHECK-PREFIXED: call void @_mcount
+// CHECK-PREFIXED-NOT: call void @_mcount
+// CHECK-DOUBLE-PREFIXED: call void @__mcount
+// CHECK-DOUBLE-PREFIXED: call void @__mcount
+// CHECK-DOUBLE-PREFIXED: call void @__mcount
+// CHECK-DOUBLE-PREFIXED-NOT: call void @__mcount
+// NO-MCOUNT-NOT: call void @{{.*}}mcount
+// NO-MCOUNT1-NOT: call void @{{.*}}mcount
Index: clang/test/CodeGen/X86/x86_64-instrument-functions.c
===================================================================
--- clang/test/CodeGen/X86/x86_64-instrument-functions.c
+++ clang/test/CodeGen/X86/x86_64-instrument-functions.c
@@ -1,41 +1,41 @@
 // REQUIRES: x86-registered-target
-// RUN: %clang_cc1 -fno-experimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -fno-experimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - %s | FileCheck -check-prefix=NOINLINE %s
+// RUN: %clang_cc1 -fno-experimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O0 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -fno-experimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -fno-experimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck -check-prefix=NOINLINE %s
 
-// RUN: %clang_cc1 -fexperimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -fexperimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - %s | FileCheck -check-prefix=NOINLINE %s
+// RUN: %clang_cc1 -fexperimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O0 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -fexperimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -fexperimental-new-pass-manager -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck -check-prefix=NOINLINE %s
 
-// It's not so nice having asm tests in Clang, but we need to check that we set
-// up the pipeline correctly in order to have the instrumentation inserted.
-
-int leaf(int x) {
+__attribute__((always_inline)) int leaf(int x) {
   return x;
-// CHECK-LABEL: leaf:
-// CHECK: callq __cyg_profile_func_enter
+// CHECK-LABEL: define {{.*}} @leaf
+// CHECK: call void @__cyg_profile_func_enter
 // CHECK-NOT: cyg_profile
-// CHECK: callq __cyg_profile_func_exit
+// CHECK: call void @__cyg_profile_func_exit
 // CHECK-NOT: cyg_profile
 // CHECK: ret
 }
 
 int root(int x) {
   return leaf(x);
-// CHECK-LABEL: root:
-// CHECK: callq __cyg_profile_func_enter
+// CHECK-LABEL: define {{.*}} @root
+// CHECK: call void @__cyg_profile_func_enter
 // CHECK-NOT: cyg_profile
 
 // Inlined from leaf():
-// CHECK: callq __cyg_profile_func_enter
+// CHECK: call void @__cyg_profile_func_enter
 // CHECK-NOT: cyg_profile
-// CHECK: callq __cyg_profile_func_exit
-
+// CHECK: call void @__cyg_profile_func_exit
 // CHECK-NOT: cyg_profile
-// CHECK: callq __cyg_profile_func_exit
+
+// CHECK: call void @__cyg_profile_func_exit
 // CHECK: ret
 
-// NOINLINE-LABEL: root:
-// NOINLINE: callq __cyg_profile_func_enter
+// NOINLINE-LABEL: define {{.*}} @root
+// NOINLINE: call void @__cyg_profile_func_enter
+// NOINLINE-NOT: cyg_profile
+// NOINLINE: call void @__cyg_profile_func_exit
 // NOINLINE-NOT: cyg_profile
-// NOINLINE: callq __cyg_profile_func_exit
 // NOINLINE: ret
 }
Index: clang/lib/CodeGen/BackendUtil.cpp
===================================================================
--- clang/lib/CodeGen/BackendUtil.cpp
+++ clang/lib/CodeGen/BackendUtil.cpp
@@ -367,6 +367,17 @@
   PM.add(createDataFlowSanitizerLegacyPassPass(LangOpts.NoSanitizeFiles));
 }
 
+static void addEntryExitInstrumentationPass(const PassManagerBuilder &Builder,
+                                            legacy::PassManagerBase &PM) {
+  PM.add(createEntryExitInstrumenterPass());
+}
+
+static void
+addPostInlineEntryExitInstrumentationPass(const PassManagerBuilder &Builder,
+                                          legacy::PassManagerBase &PM) {
+  PM.add(createPostInlineEntryExitInstrumenterPass());
+}
+
 static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
                                          const CodeGenOptions &CodeGenOpts) {
   TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
@@ -783,6 +794,20 @@
                            addDataFlowSanitizerPass);
   }
 
+  if (CodeGenOpts.InstrumentFunctions ||
+      CodeGenOpts.InstrumentFunctionEntryBare ||
+      CodeGenOpts.InstrumentFunctionsAfterInlining ||
+      CodeGenOpts.InstrumentForProfiling) {
+    PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
+                           addEntryExitInstrumentationPass);
+    PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+                           addEntryExitInstrumentationPass);
+    PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+                           addPostInlineEntryExitInstrumentationPass);
+    PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+                           addPostInlineEntryExitInstrumentationPass);
+  }
+
   // Set up the per-function pass manager.
   FPM.add(new TargetLibraryInfoWrapperPass(*TLII));
   if (CodeGenOpts.VerifyModule)
@@ -1317,12 +1342,20 @@
                                            /*DropTypeTests=*/true));
           });
 
-    if (Level != PassBuilder::OptimizationLevel::O0) {
+    if (CodeGenOpts.InstrumentFunctions ||
+        CodeGenOpts.InstrumentFunctionEntryBare ||
+        CodeGenOpts.InstrumentFunctionsAfterInlining ||
+        CodeGenOpts.InstrumentForProfiling) {
       PB.registerPipelineStartEPCallback(
           [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
             MPM.addPass(createModuleToFunctionPassAdaptor(
                 EntryExitInstrumenterPass(/*PostInlining=*/false)));
           });
+      PB.registerOptimizerLastEPCallback(
+          [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
+            MPM.addPass(createModuleToFunctionPassAdaptor(
+                EntryExitInstrumenterPass(/*PostInlining=*/true)));
+          });
     }
 
     // Register callbacks to schedule sanitizer passes at the appropriate part
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to