https://github.com/ellishg created https://github.com/llvm/llvm-project/pull/130192
Completely remove `-forder-file-instrumentation`. This was deprecated in https://github.com/llvm/llvm-project/pull/121514 and removal was planned in https://discourse.llvm.org/t/deprecate-forder-file-instrumentation-in-favor-of-temporal-profiling/83903. Since LLVM 20 has been cut (https://github.com/llvm/llvm-project/releases/tag/llvmorg-20.1.0), we can remove this feature. >From 72109c24229ce3a1deda9f8303e6e75677cd0ce4 Mon Sep 17 00:00:00 2001 From: Ellis Hoag <ellish...@meta.com> Date: Thu, 6 Mar 2025 14:17:51 -0800 Subject: [PATCH] [InstrProf] Remove -forder-file-instrumentation --- clang/docs/UsersManual.rst | 1 - clang/include/clang/Driver/Options.td | 16 +- clang/lib/Driver/ToolChain.cpp | 1 - clang/lib/Driver/ToolChains/Clang.cpp | 15 -- clang/lib/Driver/ToolChains/SYCL.cpp | 5 +- clang/test/Driver/clang_f_opts.c | 8 - compiler-rt/include/profile/InstrProfData.inc | 22 --- .../include/profile/instr_prof_interface.h | 4 - compiler-rt/lib/profile/InstrProfiling.h | 3 - compiler-rt/lib/profile/InstrProfilingFile.c | 91 +--------- .../lib/profile/InstrProfilingPlatformAIX.c | 11 +- .../profile/InstrProfilingPlatformDarwin.c | 4 - .../lib/profile/InstrProfilingPlatformLinux.c | 5 - .../lib/profile/InstrProfilingPlatformOther.c | 4 - .../profile/InstrProfilingPlatformWindows.c | 3 - .../profile/Inputs/instrprof-order-file.c | 17 -- .../test/profile/instrprof-order-file.test | 17 -- lld/test/MachO/start-end.s | 18 -- .../llvm/ProfileData/InstrProfData.inc | 22 --- .../Instrumentation/InstrOrderFile.h | 27 --- llvm/lib/Passes/PassBuilder.cpp | 1 - llvm/lib/Passes/PassBuilderPipelines.cpp | 8 - llvm/lib/Passes/PassRegistry.def | 1 - .../Transforms/Instrumentation/CMakeLists.txt | 1 - .../Instrumentation/InstrOrderFile.cpp | 169 ------------------ .../Instrumentation/InstrOrderFile/basic.ll | 23 --- .../lib/Transforms/Instrumentation/BUILD.gn | 1 - 27 files changed, 14 insertions(+), 484 deletions(-) delete mode 100644 compiler-rt/test/profile/Inputs/instrprof-order-file.c delete mode 100644 compiler-rt/test/profile/instrprof-order-file.test delete mode 100644 llvm/include/llvm/Transforms/Instrumentation/InstrOrderFile.h delete mode 100644 llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp delete mode 100644 llvm/test/Instrumentation/InstrOrderFile/basic.ll diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index 8213334b61c22..f70f786c07085 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -3195,7 +3195,6 @@ be collected. the profile file to ``Name``. * ``void __llvm_profile_reset_counters(void)``: resets all counters to zero. * ``int __llvm_profile_dump(void)``: write the profile data to disk. - * ``int __llvm_orderfile_dump(void)``: write the order file to disk. For example, the following pattern can be used to skip profiling program initialization, profile two specific hot regions, and skip profiling program diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d0414aba35209..04eb01e146853 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1811,15 +1811,13 @@ def fprofile_continuous : Flag<["-"], "fprofile-continuous">, HelpText<"Enable continuous instrumentation profiling mode">, MarshallingInfoFlag<CodeGenOpts<"ContinuousProfileSync">>; -defm pseudo_probe_for_profiling : BoolFOption<"pseudo-probe-for-profiling", - CodeGenOpts<"PseudoProbeForProfiling">, DefaultFalse, - PosFlag<SetTrue, [], [ClangOption], "Emit">, - NegFlag<SetFalse, [], [ClangOption], "Do not emit">, - BothFlags<[], [ClangOption, CC1Option], - " pseudo probes for sample profiling">>; -def forder_file_instrumentation : Flag<["-"], "forder-file-instrumentation">, - Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>, - HelpText<"Generate instrumented code to collect order file into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var). Deprecated, please use -ftemporal-profile">; +defm pseudo_probe_for_profiling + : BoolFOption<"pseudo-probe-for-profiling", + CodeGenOpts<"PseudoProbeForProfiling">, DefaultFalse, + PosFlag<SetTrue, [], [ClangOption], "Emit">, + NegFlag<SetFalse, [], [ClangOption], "Do not emit">, + BothFlags<[], [ClangOption, CC1Option], + " pseudo probes for sample profiling">>; def fprofile_list_EQ : Joined<["-"], "fprofile-list=">, Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Filename defining the list of functions/files to instrument. " diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 65acbe8a9dbea..7700321b7b8cb 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -952,7 +952,6 @@ bool ToolChain::needsProfileRT(const ArgList &Args) { Args.hasArg(options::OPT_fprofile_instr_generate) || Args.hasArg(options::OPT_fprofile_instr_generate_EQ) || Args.hasArg(options::OPT_fcreate_profile) || - Args.hasArg(options::OPT_forder_file_instrumentation) || Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage) || Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage_EQ); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4ebbd241d2f0b..9732890d55968 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8031,21 +8031,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } - if (const Arg *A = - Args.getLastArg(options::OPT_forder_file_instrumentation)) { - D.Diag(diag::warn_drv_deprecated_arg) - << A->getAsString(Args) << /*hasReplacement=*/true - << "-ftemporal-profile"; - CmdArgs.push_back("-forder-file-instrumentation"); - // Enable order file instrumentation when ThinLTO is not on. When ThinLTO is - // on, we need to pass these flags as linker flags and that will be handled - // outside of the compiler. - if (!IsUsingLTO) { - CmdArgs.push_back("-mllvm"); - CmdArgs.push_back("-enable-order-file-instrumentation"); - } - } - if (Arg *A = Args.getLastArg(options::OPT_fforce_enable_int128, options::OPT_fno_force_enable_int128)) { if (A->getOption().matches(options::OPT_fforce_enable_int128)) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index a2b07ef4824a1..a9f5317a77c2f 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -49,9 +49,8 @@ static ArrayRef<options::ID> getUnsupportedOpts() { options::OPT_fno_profile_arcs, // -f[no-]profile-arcs options::OPT_fcreate_profile, // -fcreate-profile options::OPT_fprofile_instr_use, - options::OPT_fprofile_instr_use_EQ, // -fprofile-instr-use - options::OPT_forder_file_instrumentation, // -forder-file-instrumentation - options::OPT_fcs_profile_generate, // -fcs-profile-generate + options::OPT_fprofile_instr_use_EQ, // -fprofile-instr-use + options::OPT_fcs_profile_generate, // -fcs-profile-generate options::OPT_fcs_profile_generate_EQ, }; return UnsupportedOpts; diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index 7454ce3d30f5f..f6bf71417e6f8 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -110,8 +110,6 @@ // RUN: %clang -### -S -fcoverage-mapping -fno-coverage-mapping %s 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-COVERAGE %s // RUN: %clang -### -S -fprofile-instr-generate -fcoverage-mapping -fno-coverage-mapping %s 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-COVERAGE %s // RUN: %clang -### -S -fprofile-remapping-file=foo/bar.txt %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-REMAP %s -// RUN: %clang -### -S -forder-file-instrumentation %s 2>&1 | FileCheck -check-prefix=CHECK-ORDERFILE-INSTR %s -// RUN: %clang -### --target=x86_64-linux-gnu -flto -forder-file-instrumentation %s 2>&1 | FileCheck -check-prefix=CHECK-ORDERFILE-INSTR-LTO %s // CHECK-PROFILE-GENERATE: "-fprofile-instrument=clang" // CHECK-PROFILE-GENERATE-LLVM: "-fprofile-instrument=llvm" // CHECK-PROFILE-GENERATE-DIR: "-fprofile-instrument-path=/some/dir{{/|\\\\}}{{.*}}" @@ -123,10 +121,6 @@ // CHECK-COVERAGE-AND-GEN: '-fcoverage-mapping' only allowed with '-fprofile-instr-generate' // CHECK-DISABLE-COVERAGE-NOT: "-fcoverage-mapping" // CHECK-PROFILE-REMAP: "-fprofile-remapping-file=foo/bar.txt" -// CHECK-ORDERFILE-INSTR: "-forder-file-instrumentation" -// CHECK-ORDERFILE-INSTR: "-enable-order-file-instrumentation" -// CHECK-ORDERFILE-INSTR-LTO: "-forder-file-instrumentation" -// CHECK-ORDERFILE-INSTR-LTO-NOT: "-enable-order-file-instrumentation" // RUN: %clang -### -S -fprofile-use %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-USE %s // RUN: %clang -### -S -fprofile-instr-use %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-USE %s @@ -371,7 +365,6 @@ // RUN: -fno-devirtualize-speculatively \ // RUN: -fslp-vectorize-aggressive \ // RUN: -fno-slp-vectorize-aggressive \ -// RUN: -forder-file-instrumentation \ // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING %s // CHECK-WARNING-DAG: optimization flag '-finline-limit=1000' is not supported // CHECK-WARNING-DAG: optimization flag '-finline-limit' is not supported @@ -431,7 +424,6 @@ // CHECK-WARNING-DAG: optimization flag '-fno-devirtualize-speculatively' is not supported // CHECK-WARNING-DAG: the flag '-fslp-vectorize-aggressive' has been deprecated and will be ignored // CHECK-WARNING-DAG: the flag '-fno-slp-vectorize-aggressive' has been deprecated and will be ignored -// CHECK-WARNING-DAG: argument '-forder-file-instrumentation' is deprecated, use '-ftemporal-profile' instead // Test that we mute the warning on these // RUN: %clang -### -finline-limit=1000 -Wno-invalid-command-line-argument \ diff --git a/compiler-rt/include/profile/InstrProfData.inc b/compiler-rt/include/profile/InstrProfData.inc index 39613da81ecb4..2cdfea9a579a4 100644 --- a/compiler-rt/include/profile/InstrProfData.inc +++ b/compiler-rt/include/profile/InstrProfData.inc @@ -348,9 +348,6 @@ INSTR_PROF_SECT_ENTRY(IPSK_covmap, \ INSTR_PROF_SECT_ENTRY(IPSK_covfun, \ INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON), \ INSTR_PROF_COVFUN_COFF, "__LLVM_COV,") -INSTR_PROF_SECT_ENTRY(IPSK_orderfile, \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COMMON), \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COFF), "__DATA,") INSTR_PROF_SECT_ENTRY(IPSK_covdata, \ INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON), \ INSTR_PROF_COVDATA_COFF, "__LLVM_COV,") @@ -778,7 +775,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_COMMON __llvm_covfun #define INSTR_PROF_COVDATA_COMMON __llvm_covdata #define INSTR_PROF_COVNAME_COMMON __llvm_covnames -#define INSTR_PROF_ORDERFILE_COMMON __llvm_orderfile #define INSTR_PROF_COVINIT_COMMON __llvm_covinit /* Windows section names. Because these section names contain dollar characters, @@ -799,7 +795,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, */ #define INSTR_PROF_COVDATA_COFF ".lcovd" #define INSTR_PROF_COVNAME_COFF ".lcovn" -#define INSTR_PROF_ORDERFILE_COFF ".lorderfile$M" // FIXME: Placeholder for Windows. Windows currently does not initialize // the GCOV functions in the runtime. @@ -823,7 +818,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_COVFUN_COFF #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_COVDATA_COFF #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_COVNAME_COFF -#define INSTR_PROF_ORDERFILE_SECT_NAME INSTR_PROF_ORDERFILE_COFF #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_COVINIT_COFF #else /* Runtime section names and name strings. */ @@ -843,19 +837,9 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON) #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON) #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON) -/* Order file instrumentation. */ -#define INSTR_PROF_ORDERFILE_SECT_NAME \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COMMON) #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON) #endif -#define INSTR_PROF_ORDERFILE_BUFFER_NAME _llvm_order_file_buffer -#define INSTR_PROF_ORDERFILE_BUFFER_NAME_STR \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_BUFFER_NAME) -#define INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME _llvm_order_file_buffer_idx -#define INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME_STR \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME) - /* Macros to define start/stop section symbol for a given * section on Linux. For instance * INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME) will @@ -889,12 +873,6 @@ typedef struct InstrProfValueData { #endif /* INSTR_PROF_DATA_INC */ -#ifndef INSTR_ORDER_FILE_INC -/* The maximal # of functions: 128*1024 (the buffer size will be 128*4 KB). */ -#define INSTR_ORDER_FILE_BUFFER_SIZE 131072 -#define INSTR_ORDER_FILE_BUFFER_BITS 17 -#define INSTR_ORDER_FILE_BUFFER_MASK 0x1ffff -#endif /* INSTR_ORDER_FILE_INC */ #else #undef INSTR_PROF_DATA_DEFINED #endif diff --git a/compiler-rt/include/profile/instr_prof_interface.h b/compiler-rt/include/profile/instr_prof_interface.h index be40f2685934b..678cea094a7f3 100644 --- a/compiler-rt/include/profile/instr_prof_interface.h +++ b/compiler-rt/include/profile/instr_prof_interface.h @@ -73,15 +73,11 @@ void __llvm_profile_reset_counters(void); */ int __llvm_profile_dump(void); -// Interface to dump the current process' order file to disk. -int __llvm_orderfile_dump(void); - #else #define __llvm_profile_set_filename(Name) #define __llvm_profile_reset_counters() #define __llvm_profile_dump() (0) -#define __llvm_orderfile_dump() (0) #endif diff --git a/compiler-rt/lib/profile/InstrProfiling.h b/compiler-rt/lib/profile/InstrProfiling.h index eaa4ab52c243d..77c8d6c79322d 100644 --- a/compiler-rt/lib/profile/InstrProfiling.h +++ b/compiler-rt/lib/profile/InstrProfiling.h @@ -124,7 +124,6 @@ ValueProfNode *__llvm_profile_begin_vnodes(void); ValueProfNode *__llvm_profile_end_vnodes(void); const VTableProfData *__llvm_profile_begin_vtables(void); const VTableProfData *__llvm_profile_end_vtables(void); -uint32_t *__llvm_profile_begin_orderfile(void); /*! * \brief Merge profile data from buffer. @@ -175,8 +174,6 @@ void __llvm_profile_instrument_target_value(uint64_t TargetValue, void *Data, */ int __llvm_profile_write_file(void); -int __llvm_orderfile_write_file(void); - /*! * \brief Set the FILE object for writing instrumentation data. Return 0 if set * successfully or return 1 if failed. diff --git a/compiler-rt/lib/profile/InstrProfilingFile.c b/compiler-rt/lib/profile/InstrProfilingFile.c index e5eca7947cf9b..ce5aa9a8fd328 100644 --- a/compiler-rt/lib/profile/InstrProfilingFile.c +++ b/compiler-rt/lib/profile/InstrProfilingFile.c @@ -357,15 +357,6 @@ static uint32_t fileWriter(ProfDataWriter *This, ProfDataIOVec *IOVecs, return 0; } -/* TODO: make buffer size controllable by an internal option, and compiler can pass the size - to runtime via a variable. */ -static uint32_t orderFileWriter(FILE *File, const uint32_t *DataStart) { - if (fwrite(DataStart, sizeof(uint32_t), INSTR_ORDER_FILE_BUFFER_SIZE, File) != - INSTR_ORDER_FILE_BUFFER_SIZE) - return 1; - return 0; -} - static void initFileWriter(ProfDataWriter *This, FILE *File) { This->Write = fileWriter; This->WriterCtx = File; @@ -503,7 +494,7 @@ static void createProfileDir(const char *Filename) { * the original profile data is truncated and gets ready for the profile * dumper. With profile merging enabled, each executable as well as any of * its instrumented shared libraries dump profile data into their own data file. -*/ + */ static FILE *openFileForMerging(const char *ProfileFileName, int *MergeDone) { FILE *ProfileFile = getProfileFile(); int rc; @@ -577,27 +568,6 @@ static int writeFile(const char *OutputName) { return RetVal; } -/* Write order data to file \c OutputName. */ -static int writeOrderFile(const char *OutputName) { - int RetVal; - FILE *OutputFile; - - OutputFile = fopen(OutputName, "w"); - - if (!OutputFile) { - PROF_WARN("can't open file with mode ab: %s\n", OutputName); - return -1; - } - - FreeHook = &free; - setupIOBuffer(); - const uint32_t *DataBegin = __llvm_profile_begin_orderfile(); - RetVal = orderFileWriter(OutputFile, DataBegin); - - fclose(OutputFile); - return RetVal; -} - #define LPROF_INIT_ONCE_ENV "__LLVM_PROFILE_RT_INIT_ONCE" static void truncateCurrentFile(void) { @@ -1239,65 +1209,6 @@ int __llvm_profile_dump(void) { return rc; } -/* Order file data will be saved in a file with suffx .order. */ -static const char *OrderFileSuffix = ".order"; - -COMPILER_RT_VISIBILITY -int __llvm_orderfile_write_file(void) { - int rc, Length, LengthBeforeAppend, SuffixLength; - const char *Filename; - char *FilenameBuf; - - // Temporarily suspend getting SIGKILL when the parent exits. - int PDeathSig = lprofSuspendSigKill(); - - SuffixLength = strlen(OrderFileSuffix); - Length = getCurFilenameLength() + SuffixLength; - FilenameBuf = (char *)COMPILER_RT_ALLOCA(Length + 1); - Filename = getCurFilename(FilenameBuf, 1); - - /* Check the filename. */ - if (!Filename) { - PROF_ERR("Failed to write file : %s\n", "Filename not set"); - if (PDeathSig == 1) - lprofRestoreSigKill(); - return -1; - } - - /* Append order file suffix */ - LengthBeforeAppend = strlen(Filename); - memcpy(FilenameBuf + LengthBeforeAppend, OrderFileSuffix, SuffixLength); - FilenameBuf[LengthBeforeAppend + SuffixLength] = '\0'; - - /* Check if there is llvm/runtime version mismatch. */ - if (GET_VERSION(__llvm_profile_get_version()) != INSTR_PROF_RAW_VERSION) { - PROF_ERR("Runtime and instrumentation version mismatch : " - "expected %d, but get %d\n", - INSTR_PROF_RAW_VERSION, - (int)GET_VERSION(__llvm_profile_get_version())); - if (PDeathSig == 1) - lprofRestoreSigKill(); - return -1; - } - - /* Write order data to the file. */ - rc = writeOrderFile(Filename); - if (rc) - PROF_ERR("Failed to write file \"%s\": %s\n", Filename, strerror(errno)); - - // Restore SIGKILL. - if (PDeathSig == 1) - lprofRestoreSigKill(); - - return rc; -} - -COMPILER_RT_VISIBILITY -int __llvm_orderfile_dump(void) { - int rc = __llvm_orderfile_write_file(); - return rc; -} - static void writeFileWithoutReturn(void) { __llvm_profile_write_file(); } COMPILER_RT_VISIBILITY diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformAIX.c b/compiler-rt/lib/profile/InstrProfilingPlatformAIX.c index 651f8785d0b94..9cb313bc7a1fc 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformAIX.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformAIX.c @@ -196,8 +196,6 @@ static const int dummy_name[0] COMPILER_RT_SECTION( COMPILER_RT_SEG INSTR_PROF_NAME_SECT_NAME); static int dummy_vnds[0] COMPILER_RT_SECTION( COMPILER_RT_SEG INSTR_PROF_VNODES_SECT_NAME); -static int dummy_orderfile[0] COMPILER_RT_SECTION( - COMPILER_RT_SEG INSTR_PROF_ORDERFILE_SECT_NAME); static int dummy_vname[0] COMPILER_RT_SECTION( COMPILER_RT_SEG INSTR_PROF_VNAME_SECT_NAME); static int dummy_vtab[0] COMPILER_RT_SECTION( @@ -213,11 +211,10 @@ static int dummy_covinit_funcs[0] COMPILER_RT_SECTION( #pragma GCC diagnostic ignored "-Wcast-qual" #endif COMPILER_RT_VISIBILITY -void *__llvm_profile_keep[] = {(void *)&dummy_cnts, (void *)&dummy_bits, - (void *)&dummy_data, (void *)&dummy_name, - (void *)&dummy_vnds, (void *)&dummy_orderfile, - (void *)&dummy_vname, (void *)&dummy_vtab, - (void *)&dummy_covinit_funcs}; +void *__llvm_profile_keep[] = { + (void *)&dummy_cnts, (void *)&dummy_bits, (void *)&dummy_data, + (void *)&dummy_name, (void *)&dummy_vnds, (void *)&dummy_vname, + (void *)&dummy_vtab, (void *)&dummy_covinit_funcs}; #ifdef __GNUC__ #pragma GCC diagnostic pop #endif diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformDarwin.c b/compiler-rt/lib/profile/InstrProfilingPlatformDarwin.c index 6adc7f328cbf7..8c682ae118358 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformDarwin.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformDarwin.c @@ -47,8 +47,6 @@ extern char COMPILER_RT_VISIBILITY extern char VNameEnd __asm("section$end$__DATA$" INSTR_PROF_VNAME_SECT_NAME); COMPILER_RT_VISIBILITY -extern uint32_t - OrderFileStart __asm("section$start$__DATA$" INSTR_PROF_ORDERFILE_SECT_NAME); COMPILER_RT_VISIBILITY extern ValueProfNode @@ -87,8 +85,6 @@ COMPILER_RT_VISIBILITY const char *__llvm_profile_begin_vtabnames(void) { return &VNameStart; } COMPILER_RT_VISIBILITY const char *__llvm_profile_end_vtabnames(void) { return &VNameEnd; } -COMPILER_RT_VISIBILITY -uint32_t *__llvm_profile_begin_orderfile(void) { return &OrderFileStart; } COMPILER_RT_VISIBILITY ValueProfNode *__llvm_profile_begin_vnodes(void) { diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c index 5b230c1b20062..558b7fc8cad62 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c @@ -32,7 +32,6 @@ #define PROF_VTABLE_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VTAB_COMMON) #define PROF_BITS_START INSTR_PROF_SECT_START(INSTR_PROF_BITS_COMMON) #define PROF_BITS_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_BITS_COMMON) -#define PROF_ORDERFILE_START INSTR_PROF_SECT_START(INSTR_PROF_ORDERFILE_COMMON) #define PROF_VNODES_START INSTR_PROF_SECT_START(INSTR_PROF_VNODES_COMMON) #define PROF_VNODES_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VNODES_COMMON) #define PROF_COVINIT_START INSTR_PROF_SECT_START(INSTR_PROF_COVINIT_COMMON) @@ -53,7 +52,6 @@ extern char PROF_VNAME_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_VNAME_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_BITS_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_BITS_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; -extern uint32_t PROF_ORDERFILE_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_NAME_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_NAME_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern ValueProfNode PROF_VNODES_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; @@ -102,9 +100,6 @@ COMPILER_RT_VISIBILITY char *__llvm_profile_begin_bitmap(void) { COMPILER_RT_VISIBILITY char *__llvm_profile_end_bitmap(void) { return &PROF_BITS_STOP; } -COMPILER_RT_VISIBILITY uint32_t *__llvm_profile_begin_orderfile(void) { - return &PROF_ORDERFILE_START; -} COMPILER_RT_VISIBILITY ValueProfNode * __llvm_profile_begin_vnodes(void) { diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformOther.c b/compiler-rt/lib/profile/InstrProfilingPlatformOther.c index 29e570b9fba92..19414ab78b3be 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformOther.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformOther.c @@ -27,7 +27,6 @@ static const char *VNamesFirst = NULL; static const char *VNamesLast = NULL; static char *CountersFirst = NULL; static char *CountersLast = NULL; -static uint32_t *OrderFileFirst = NULL; static const void *getMinAddr(const void *A1, const void *A2) { return A1 < A2 ? A1 : A2; @@ -108,9 +107,6 @@ COMPILER_RT_VISIBILITY char *__llvm_profile_begin_bitmap(void) { return BitmapFirst; } COMPILER_RT_VISIBILITY char *__llvm_profile_end_bitmap(void) { return BitmapLast; } -/* TODO: correctly set up OrderFileFirst. */ -COMPILER_RT_VISIBILITY -uint32_t *__llvm_profile_begin_orderfile(void) { return OrderFileFirst; } COMPILER_RT_VISIBILITY ValueProfNode *__llvm_profile_begin_vnodes(void) { diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformWindows.c b/compiler-rt/lib/profile/InstrProfilingPlatformWindows.c index 741b01faada4e..d1b347e861411 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformWindows.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformWindows.c @@ -36,7 +36,6 @@ #pragma section(".lprfc$Z", read, write) #pragma section(".lprfb$A", read, write) #pragma section(".lprfb$Z", read, write) -#pragma section(".lorderfile$A", read, write) #pragma section(".lprfnd$A", read, write) #pragma section(".lprfnd$Z", read, write) #endif @@ -51,7 +50,6 @@ char COMPILER_RT_SECTION(".lprfc$A") CountersStart; char COMPILER_RT_SECTION(".lprfc$Z") CountersEnd; char COMPILER_RT_SECTION(".lprfb$A") BitmapStart; char COMPILER_RT_SECTION(".lprfb$Z") BitmapEnd; -uint32_t COMPILER_RT_SECTION(".lorderfile$A") OrderFileStart; ValueProfNode COMPILER_RT_SECTION(".lprfnd$A") VNodesStart; ValueProfNode COMPILER_RT_SECTION(".lprfnd$Z") VNodesEnd; @@ -85,7 +83,6 @@ char *__llvm_profile_begin_counters(void) { return &CountersStart + 1; } char *__llvm_profile_end_counters(void) { return &CountersEnd; } char *__llvm_profile_begin_bitmap(void) { return &BitmapStart + 1; } char *__llvm_profile_end_bitmap(void) { return &BitmapEnd; } -uint32_t *__llvm_profile_begin_orderfile(void) { return &OrderFileStart; } ValueProfNode *__llvm_profile_begin_vnodes(void) { return &VNodesStart + 1; } ValueProfNode *__llvm_profile_end_vnodes(void) { return &VNodesEnd; } diff --git a/compiler-rt/test/profile/Inputs/instrprof-order-file.c b/compiler-rt/test/profile/Inputs/instrprof-order-file.c deleted file mode 100644 index 9251a8e255242..0000000000000 --- a/compiler-rt/test/profile/Inputs/instrprof-order-file.c +++ /dev/null @@ -1,17 +0,0 @@ -void __llvm_profile_initialize_file(void); -int __llvm_orderfile_dump(void); - -__attribute__((noinline)) int f(int a); - -__attribute__((noinline)) int g(int a); - -int main(int argc, const char *argv[]) { - int a = f(argc); - int t = 0; - for (int i = 0; i < argc; i++) - t += g(a); - f(t); - __llvm_profile_initialize_file(); - __llvm_orderfile_dump(); - return 0; -} diff --git a/compiler-rt/test/profile/instrprof-order-file.test b/compiler-rt/test/profile/instrprof-order-file.test deleted file mode 100644 index e7f5681f7e104..0000000000000 --- a/compiler-rt/test/profile/instrprof-order-file.test +++ /dev/null @@ -1,17 +0,0 @@ -// UNSUPPORTED: target={{.*windows.*}} -// REQUIRES: darwin -// RUN: rm -rf %t.dir && mkdir -p %t.dir -// RUN: cd %t.dir -// -// RUN: %clang -forder-file-instrumentation -O1 -o %t.2 %S/Inputs/instrprof-order-file-2.c %S/Inputs/instrprof-order-file.c -mllvm -orderfile-write-mapping="mapping.txt" -// RUN: %run %t.2 ANY -// RUN: od -h default.profraw.order | FileCheck %s -// RUN: cat mapping.txt | FileCheck %s --check-prefix=MAPPING - -// Make sure we have MD5 for main, then f, then g. -// CHECK: 0000000 d5fa e78d 6436 db95 a18f dd4c 4f75 cc91 -// CHECK: 0000020 f5b2 47ff 6643 b671 0000 0000 0000 0000 - -// MAPPING: MD5 cc914f75dd4ca18f f -// MAPPING: MD5 b671664347fff5b2 g -// MAPPING: MD5 db956436e78dd5fa main diff --git a/lld/test/MachO/start-end.s b/lld/test/MachO/start-end.s index 81d1172bbdaff..6b9abd9f81552 100644 --- a/lld/test/MachO/start-end.s +++ b/lld/test/MachO/start-end.s @@ -88,7 +88,6 @@ # STRIP-NEXT: 0 __text {{[0-9a-f]*}} [[#%x, TEXTSTART:]] TEXT # STRIP-NEXT: 1 __cstring 00000000 [[#%x, CSTRINGSTART:]] DATA # STRIP-NEXT: 2 __data 00000000 -# STRIP-NEXT: 3 __llvm_orderfile 00000000 # STRIP-NEXT: 4 __mybss 00000000 # STRIP-NEXT: 5 __bar 00000000 # STRIP-NEXT: 6 __ever 00000000 @@ -110,7 +109,6 @@ # STRIP2-NEXT: 0 __text {{[0-9a-f]*}} [[#%x, TEXTSTART:]] TEXT # STRIP2-NEXT: 1 __cstring 00000000 [[#%x, CSTRINGSTART:]] DATA # STRIP2-NEXT: 2 __data 00000000 -# STRIP2-NEXT: 3 __llvm_orderfile 00000000 # STRIP2-NEXT: 4 __mybss 00000000 # STRIP2-NEXT: 5 __bar 00000000 # STRIP2-NEXT: 6 __notexist 00000000 @@ -126,7 +124,6 @@ # CHECK: 2 __cstring {{[0-9a-f]*}} [[#%x, CSTRINGSTART:]] DATA # CHECK: 3 __aftercstring {{[0-9a-f]*}} [[#%x, CSTRINGEND:]] # CHECK: 4 __data 00000008 [[#%x, DATASTART:]] DATA -# CHECK: 5 __llvm_orderfile 00000000 [[#%x, LLVMORDERFILESTART:]] DATA # CHECK: 6 __mybss 00008000 [[#%x, MYBSSSTART:]] BSS # CHECK: 7 __quux 0000002a [[#%x, QUUXSTART:]] # CHECK: 8 __bar 00000059 [[#%x, BARSTART:]] @@ -142,8 +139,6 @@ # CHECK-NOT: section$end$__TEXT$__cstring # CHECK-NOT: section$start$__DATA$__data # CHECK-NOT: section$end$__DATA$__data -# CHECK-NOT: section$start$__DATA$__llvm_orderfile -# CHECK-NOT: section$end$__DATA$__llvm_orderfile # CHECK-NOT: section$start$__DYNAMIC$__lookup # CHECK-NOT: section$start$__DYNAMIC$__unref # CHECK: section$end$ACTUAL$symbol @@ -180,13 +175,6 @@ # CHECK-NEXT: [[#%x, PC8:]]: # CHECK-SAME: leaq [[#%d, MYBSSSTART + 0x8000 - PC8 - 7]](%rip), %rbx -## section$start$__DATA$__llvm_orderfile / section$end$__DATA$__llvm_orderfile -## This section has size 0. -# CHECK: [[#%x, PC9:]]: -# CHECK-SAME: leaq [[#%d, LLVMORDERFILESTART - PC9 - 7]](%rip), %rax -# CHECK-NEXT: [[#%x, PC10:]]: -# CHECK-SAME: leaq [[#%d, LLVMORDERFILESTART - PC10 - 7]](%rip), %rbx - ## Section-rename tests. ## Input section __FOO/__bar is renamed to output section ## __BAZ/__quux by a -rename_section flag. @@ -350,12 +338,6 @@ _main: movq section$start$__MYBSS$__mybss@GOTPCREL(%rip), %rax movq section$end$__MYBSS$__mybss@GOTPCREL(%rip), %rbx - # Referring to a non-existent section wills it into existence. - # This is needed for e.g. __DATA/__llvm_orderfile in libclang_rt.profile. - # This means `-u` can be used as a janky `-sectcreate`. - movq section$start$__DATA$__llvm_orderfile@GOTPCREL(%rip), %rax - movq section$end$__DATA$__llvm_orderfile@GOTPCREL(%rip), %rbx - # Section-rename tests. movq section$start$__FOO$__bar@GOTPCREL(%rip), %rax movq section$end$__FOO$__bar@GOTPCREL(%rip), %rbx diff --git a/llvm/include/llvm/ProfileData/InstrProfData.inc b/llvm/include/llvm/ProfileData/InstrProfData.inc index 39613da81ecb4..2cdfea9a579a4 100644 --- a/llvm/include/llvm/ProfileData/InstrProfData.inc +++ b/llvm/include/llvm/ProfileData/InstrProfData.inc @@ -348,9 +348,6 @@ INSTR_PROF_SECT_ENTRY(IPSK_covmap, \ INSTR_PROF_SECT_ENTRY(IPSK_covfun, \ INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON), \ INSTR_PROF_COVFUN_COFF, "__LLVM_COV,") -INSTR_PROF_SECT_ENTRY(IPSK_orderfile, \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COMMON), \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COFF), "__DATA,") INSTR_PROF_SECT_ENTRY(IPSK_covdata, \ INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON), \ INSTR_PROF_COVDATA_COFF, "__LLVM_COV,") @@ -778,7 +775,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_COMMON __llvm_covfun #define INSTR_PROF_COVDATA_COMMON __llvm_covdata #define INSTR_PROF_COVNAME_COMMON __llvm_covnames -#define INSTR_PROF_ORDERFILE_COMMON __llvm_orderfile #define INSTR_PROF_COVINIT_COMMON __llvm_covinit /* Windows section names. Because these section names contain dollar characters, @@ -799,7 +795,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, */ #define INSTR_PROF_COVDATA_COFF ".lcovd" #define INSTR_PROF_COVNAME_COFF ".lcovn" -#define INSTR_PROF_ORDERFILE_COFF ".lorderfile$M" // FIXME: Placeholder for Windows. Windows currently does not initialize // the GCOV functions in the runtime. @@ -823,7 +818,6 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_COVFUN_COFF #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_COVDATA_COFF #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_COVNAME_COFF -#define INSTR_PROF_ORDERFILE_SECT_NAME INSTR_PROF_ORDERFILE_COFF #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_COVINIT_COFF #else /* Runtime section names and name strings. */ @@ -843,19 +837,9 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON) #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON) #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON) -/* Order file instrumentation. */ -#define INSTR_PROF_ORDERFILE_SECT_NAME \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_COMMON) #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON) #endif -#define INSTR_PROF_ORDERFILE_BUFFER_NAME _llvm_order_file_buffer -#define INSTR_PROF_ORDERFILE_BUFFER_NAME_STR \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_BUFFER_NAME) -#define INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME _llvm_order_file_buffer_idx -#define INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME_STR \ - INSTR_PROF_QUOTE(INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME) - /* Macros to define start/stop section symbol for a given * section on Linux. For instance * INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME) will @@ -889,12 +873,6 @@ typedef struct InstrProfValueData { #endif /* INSTR_PROF_DATA_INC */ -#ifndef INSTR_ORDER_FILE_INC -/* The maximal # of functions: 128*1024 (the buffer size will be 128*4 KB). */ -#define INSTR_ORDER_FILE_BUFFER_SIZE 131072 -#define INSTR_ORDER_FILE_BUFFER_BITS 17 -#define INSTR_ORDER_FILE_BUFFER_MASK 0x1ffff -#endif /* INSTR_ORDER_FILE_INC */ #else #undef INSTR_PROF_DATA_DEFINED #endif diff --git a/llvm/include/llvm/Transforms/Instrumentation/InstrOrderFile.h b/llvm/include/llvm/Transforms/Instrumentation/InstrOrderFile.h deleted file mode 100644 index e3d75f675c93b..0000000000000 --- a/llvm/include/llvm/Transforms/Instrumentation/InstrOrderFile.h +++ /dev/null @@ -1,27 +0,0 @@ -//===- InstrOrderFile.h ---- Late IR instrumentation for order file ----===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_INSTRORDERFILE_H -#define LLVM_TRANSFORMS_INSTRUMENTATION_INSTRORDERFILE_H - -#include "llvm/IR/PassManager.h" - -namespace llvm { -class Module; - -/// The instrumentation pass for recording function order. -class InstrOrderFilePass : public PassInfoMixin<InstrOrderFilePass> { -public: - PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); -}; - -} // end namespace llvm - -#endif // LLVM_TRANSFORMS_INSTRUMENTATION_INSTRORDERFILE_H diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 8080059f0bb03..4c107daf20146 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -226,7 +226,6 @@ #include "llvm/Transforms/Instrumentation/DataFlowSanitizer.h" #include "llvm/Transforms/Instrumentation/GCOVProfiler.h" #include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h" -#include "llvm/Transforms/Instrumentation/InstrOrderFile.h" #include "llvm/Transforms/Instrumentation/InstrProfiling.h" #include "llvm/Transforms/Instrumentation/KCFI.h" #include "llvm/Transforms/Instrumentation/LowerAllowCheckPass.h" diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp index 07db107325f02..a18b36ba40754 100644 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -76,7 +76,6 @@ #include "llvm/Transforms/InstCombine/InstCombine.h" #include "llvm/Transforms/Instrumentation/CGProfile.h" #include "llvm/Transforms/Instrumentation/ControlHeightReduction.h" -#include "llvm/Transforms/Instrumentation/InstrOrderFile.h" #include "llvm/Transforms/Instrumentation/InstrProfiling.h" #include "llvm/Transforms/Instrumentation/MemProfiler.h" #include "llvm/Transforms/Instrumentation/PGOCtxProfFlattening.h" @@ -267,10 +266,6 @@ static cl::opt<bool> FlattenedProfileUsed( cl::desc("Indicate the sample profile being used is flattened, i.e., " "no inline hierarchy exists in the profile")); -static cl::opt<bool> EnableOrderFileInstrumentation( - "enable-order-file-instrumentation", cl::init(false), cl::Hidden, - cl::desc("Enable order file instrumentation (default = off)")); - static cl::opt<bool> EnableMatrix("enable-matrix", cl::init(false), cl::Hidden, cl::desc("Enable lowering of the matrix intrinsics")); @@ -1466,9 +1461,6 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level, if (!LTOPreLink) MPM.addPass(EliminateAvailableExternallyPass()); - if (EnableOrderFileInstrumentation) - MPM.addPass(InstrOrderFilePass()); - // Do RPO function attribute inference across the module to forward-propagate // attributes where applicable. // FIXME: Is this really an optimization rather than a canonicalization? diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index bfd952df25e98..586d4b7e02fc1 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -88,7 +88,6 @@ MODULE_PASS("inliner-wrapper", ModuleInlinerWrapperPass()) MODULE_PASS("inliner-wrapper-no-mandatory-first", ModuleInlinerWrapperPass(getInlineParams(), false)) MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass()) -MODULE_PASS("instrorderfile", InstrOrderFilePass()) MODULE_PASS("instrprof", InstrProfilingLoweringPass()) MODULE_PASS("ctx-instr-lower", PGOCtxProfLoweringPass()) MODULE_PASS("print<ctx-prof-analysis>", CtxProfAnalysisPrinterPass(errs())) diff --git a/llvm/lib/Transforms/Instrumentation/CMakeLists.txt b/llvm/lib/Transforms/Instrumentation/CMakeLists.txt index 5c437437fe362..0b863f6fef460 100644 --- a/llvm/lib/Transforms/Instrumentation/CMakeLists.txt +++ b/llvm/lib/Transforms/Instrumentation/CMakeLists.txt @@ -10,7 +10,6 @@ add_llvm_component_library(LLVMInstrumentation MemorySanitizer.cpp NumericalStabilitySanitizer.cpp IndirectCallPromotion.cpp - InstrOrderFile.cpp InstrProfiling.cpp KCFI.cpp LowerAllowCheckPass.cpp diff --git a/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp b/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp deleted file mode 100644 index f701df0002e7c..0000000000000 --- a/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp +++ /dev/null @@ -1,169 +0,0 @@ -//===- InstrOrderFile.cpp ---- Late IR instrumentation for order file ----===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -//===----------------------------------------------------------------------===// - -#include "llvm/Transforms/Instrumentation/InstrOrderFile.h" -#include "llvm/IR/Constants.h" -#include "llvm/IR/Function.h" -#include "llvm/IR/GlobalValue.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/Module.h" -#include "llvm/ProfileData/InstrProf.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/Transforms/Utils/Instrumentation.h" -#include <mutex> -#include <sstream> - -using namespace llvm; -#define DEBUG_TYPE "instrorderfile" - -static cl::opt<std::string> ClOrderFileWriteMapping( - "orderfile-write-mapping", cl::init(""), - cl::desc( - "Dump functions and their MD5 hash to deobfuscate profile data"), - cl::Hidden); - -namespace { - -// We need a global bitmap to tell if a function is executed. We also -// need a global variable to save the order of functions. We can use a -// fixed-size buffer that saves the MD5 hash of the function. We need -// a global variable to save the index into the buffer. - -std::mutex MappingMutex; - -struct InstrOrderFile { -private: - GlobalVariable *OrderFileBuffer; - GlobalVariable *BufferIdx; - GlobalVariable *BitMap; - ArrayType *BufferTy; - ArrayType *MapTy; - -public: - InstrOrderFile() = default; - - void createOrderFileData(Module &M) { - LLVMContext &Ctx = M.getContext(); - int NumFunctions = 0; - for (Function &F : M) { - if (!F.isDeclaration()) - NumFunctions++; - } - - BufferTy = - ArrayType::get(Type::getInt64Ty(Ctx), INSTR_ORDER_FILE_BUFFER_SIZE); - Type *IdxTy = Type::getInt32Ty(Ctx); - MapTy = ArrayType::get(Type::getInt8Ty(Ctx), NumFunctions); - - // Create the global variables. - std::string SymbolName = INSTR_PROF_ORDERFILE_BUFFER_NAME_STR; - OrderFileBuffer = new GlobalVariable(M, BufferTy, false, GlobalValue::LinkOnceODRLinkage, - Constant::getNullValue(BufferTy), SymbolName); - const Triple &TT = M.getTargetTriple(); - OrderFileBuffer->setSection( - getInstrProfSectionName(IPSK_orderfile, TT.getObjectFormat())); - - std::string IndexName = INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME_STR; - BufferIdx = new GlobalVariable(M, IdxTy, false, GlobalValue::LinkOnceODRLinkage, - Constant::getNullValue(IdxTy), IndexName); - - std::string BitMapName = "bitmap_0"; - BitMap = new GlobalVariable(M, MapTy, false, GlobalValue::PrivateLinkage, - Constant::getNullValue(MapTy), BitMapName); - } - - // Generate the code sequence in the entry block of each function to - // update the buffer. - void generateCodeSequence(Module &M, Function &F, int FuncId) { - if (!ClOrderFileWriteMapping.empty()) { - std::lock_guard<std::mutex> LogLock(MappingMutex); - std::error_code EC; - llvm::raw_fd_ostream OS(ClOrderFileWriteMapping, EC, - llvm::sys::fs::OF_Append); - if (EC) { - report_fatal_error(Twine("Failed to open ") + ClOrderFileWriteMapping + - " to save mapping file for order file instrumentation\n"); - } else { - std::stringstream stream; - stream << std::hex << MD5Hash(F.getName()); - std::string singleLine = "MD5 " + stream.str() + " " + - std::string(F.getName()) + '\n'; - OS << singleLine; - } - } - - BasicBlock *OrigEntry = &F.getEntryBlock(); - - LLVMContext &Ctx = M.getContext(); - IntegerType *Int32Ty = Type::getInt32Ty(Ctx); - IntegerType *Int8Ty = Type::getInt8Ty(Ctx); - - // Create a new entry block for instrumentation. We will check the bitmap - // in this basic block. - BasicBlock *NewEntry = - BasicBlock::Create(M.getContext(), "order_file_entry", &F, OrigEntry); - IRBuilder<> entryB(NewEntry); - // Create a basic block for updating the circular buffer. - BasicBlock *UpdateOrderFileBB = - BasicBlock::Create(M.getContext(), "order_file_set", &F, OrigEntry); - IRBuilder<> updateB(UpdateOrderFileBB); - - // Check the bitmap, if it is already 1, do nothing. - // Otherwise, set the bit, grab the index, update the buffer. - Value *IdxFlags[] = {ConstantInt::get(Int32Ty, 0), - ConstantInt::get(Int32Ty, FuncId)}; - Value *MapAddr = entryB.CreateGEP(MapTy, BitMap, IdxFlags, ""); - LoadInst *loadBitMap = entryB.CreateLoad(Int8Ty, MapAddr, ""); - entryB.CreateStore(ConstantInt::get(Int8Ty, 1), MapAddr); - Value *IsNotExecuted = - entryB.CreateICmpEQ(loadBitMap, ConstantInt::get(Int8Ty, 0)); - entryB.CreateCondBr(IsNotExecuted, UpdateOrderFileBB, OrigEntry); - - // Fill up UpdateOrderFileBB: grab the index, update the buffer! - Value *IdxVal = updateB.CreateAtomicRMW( - AtomicRMWInst::Add, BufferIdx, ConstantInt::get(Int32Ty, 1), - MaybeAlign(), AtomicOrdering::SequentiallyConsistent); - // We need to wrap around the index to fit it inside the buffer. - Value *WrappedIdx = updateB.CreateAnd( - IdxVal, ConstantInt::get(Int32Ty, INSTR_ORDER_FILE_BUFFER_MASK)); - Value *BufferGEPIdx[] = {ConstantInt::get(Int32Ty, 0), WrappedIdx}; - Value *BufferAddr = - updateB.CreateGEP(BufferTy, OrderFileBuffer, BufferGEPIdx, ""); - updateB.CreateStore(ConstantInt::get(Type::getInt64Ty(Ctx), MD5Hash(F.getName())), - BufferAddr); - updateB.CreateBr(OrigEntry); - } - - bool run(Module &M) { - createOrderFileData(M); - - int FuncId = 0; - for (Function &F : M) { - if (F.isDeclaration()) - continue; - generateCodeSequence(M, F, FuncId); - ++FuncId; - } - - return true; - } - -}; // End of InstrOrderFile struct -} // End anonymous namespace - -PreservedAnalyses -InstrOrderFilePass::run(Module &M, ModuleAnalysisManager &AM) { - if (InstrOrderFile().run(M)) - return PreservedAnalyses::none(); - return PreservedAnalyses::all(); -} diff --git a/llvm/test/Instrumentation/InstrOrderFile/basic.ll b/llvm/test/Instrumentation/InstrOrderFile/basic.ll deleted file mode 100644 index 7399ebad4519e..0000000000000 --- a/llvm/test/Instrumentation/InstrOrderFile/basic.ll +++ /dev/null @@ -1,23 +0,0 @@ -; RUN: opt -passes=instrorderfile -S < %s | FileCheck %s - -target triple = "x86_64-apple-macosx10.10.0" - -; CHECK: @_llvm_order_file_buffer ={{.*}}global [131072 x i64] zeroinitializer -; CHECK: @_llvm_order_file_buffer_idx = linkonce_odr global i32 0 -; CHECK: @bitmap_0 ={{.*}}global [1 x i8] zeroinitializer - -define i32 @_Z1fv() { - ret i32 0 -} -; CHECK-LABEL: define i32 @_Z1fv -; CHECK: order_file_entry -; CHECK: %[[T1:.+]] = load i8, ptr @bitmap_0 -; CHECK: store i8 1, ptr @bitmap_0 -; CHECK: %[[T2:.+]] = icmp eq i8 %[[T1]], 0 -; CHECK: br i1 %[[T2]], label %order_file_set, label - -; CHECK: order_file_set -; CHECK: %[[T3:.+]] = atomicrmw add ptr @_llvm_order_file_buffer_idx, i32 1 seq_cst -; CHECK: %[[T5:.+]] = and i32 %[[T3]], 131071 -; CHECK: %[[T4:.+]] = getelementptr [131072 x i64], ptr @_llvm_order_file_buffer, i32 0, i32 %[[T5]] -; CHECK: store i64 {{.*}}, ptr %[[T4]] diff --git a/llvm/utils/gn/secondary/llvm/lib/Transforms/Instrumentation/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Transforms/Instrumentation/BUILD.gn index 97996b3d402fb..2155835583a04 100644 --- a/llvm/utils/gn/secondary/llvm/lib/Transforms/Instrumentation/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/lib/Transforms/Instrumentation/BUILD.gn @@ -19,7 +19,6 @@ static_library("Instrumentation") { "GCOVProfiling.cpp", "HWAddressSanitizer.cpp", "IndirectCallPromotion.cpp", - "InstrOrderFile.cpp", "InstrProfiling.cpp", "KCFI.cpp", "LowerAllowCheckPass.cpp", _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits