Index: clang/lib/Driver/ToolChains/AIX.cpp =================================================================== --- clang/lib/Driver/ToolChains/AIX.cpp +++ clang/lib/Driver/ToolChains/AIX.cpp @@ -117,7 +117,7 @@ options::OPT_fno_profile_generate, false) || Args.hasArg(options::OPT_fcreate_profile) || Args.hasArg(options::OPT_coverage)) - CmdArgs.push_back("-bdbg:namedsects"); + CmdArgs.push_back("-bdbg:namedsects:ss"); // Specify linker output file. assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); Index: clang/test/Driver/aix-ld.c =================================================================== --- clang/test/Driver/aix-ld.c +++ clang/test/Driver/aix-ld.c @@ -664,7 +664,7 @@ // CHECK-PGO-NON-LTO: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-PGO-NON-LTO: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-PGO-NON-LTO: "{{.*}}ld{{(.exe)?}}" -// CHECK-PGO-NON-LTO: "-bdbg:namedsects" +// CHECK-PGO-NON-LTO: "-bdbg:namedsects:ss" // CHECK-PGO-NON-LTO: "-b32" // CHECK-PGO-NON-LTO: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-PGO-NON-LTO: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" @@ -692,7 +692,7 @@ // CHECK-PGO-LTO: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-PGO-LTO: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-PGO-LTO: "{{.*}}ld{{(.exe)?}}" -// CHECK-PGO-LTO: "-bdbg:namedsects" +// CHECK-PGO-LTO: "-bdbg:namedsects:ss" // CHECK-PGO-LTO: "-b32" // CHECK-PGO-LTO: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-PGO-LTO: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" Index: compiler-rt/lib/profile/InstrProfilingPlatformLinux.c =================================================================== --- compiler-rt/lib/profile/InstrProfilingPlatformLinux.c +++ compiler-rt/lib/profile/InstrProfilingPlatformLinux.c @@ -7,10 +7,13 @@ \*===----------------------------------------------------------------------===*/ #if defined(__linux__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ - (defined(__sun__) && defined(__svr4__)) || defined(__NetBSD__) + (defined(__sun__) && defined(__svr4__)) || defined(__NetBSD__) || \ + defined(_AIX) +#if !defined(_AIX) #include #include +#endif #include #include @@ -227,4 +230,14 @@ } #endif +#if defined(_AIX) +// Empty stubs to allow linking object files using the registration-based scheme +COMPILER_RT_VISIBILITY +void __llvm_profile_register_function(void *Data_) {} + +COMPILER_RT_VISIBILITY +void __llvm_profile_register_names_function(void *NamesStart, + uint64_t NamesSize) {} +#endif + #endif Index: compiler-rt/lib/profile/InstrProfilingPlatformOther.c =================================================================== --- compiler-rt/lib/profile/InstrProfilingPlatformOther.c +++ compiler-rt/lib/profile/InstrProfilingPlatformOther.c @@ -8,7 +8,7 @@ #if !defined(__APPLE__) && !defined(__linux__) && !defined(__FreeBSD__) && \ !defined(__Fuchsia__) && !(defined(__sun__) && defined(__svr4__)) && \ - !defined(__NetBSD__) && !defined(_WIN32) + !defined(__NetBSD__) && !defined(_WIN32) && !defined(_AIX) #include #include Index: llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -856,7 +856,8 @@ return false; // Use linker script magic to get data/cnts/name start/end. if (TT.isOSLinux() || TT.isOSFreeBSD() || TT.isOSNetBSD() || - TT.isOSSolaris() || TT.isOSFuchsia() || TT.isPS4() || TT.isOSWindows()) + TT.isOSSolaris() || TT.isOSFuchsia() || TT.isPS4() || TT.isOSWindows() || + TT.isOSAIX()) return false; return true; Index: llvm/test/Instrumentation/InstrProfiling/platform.ll =================================================================== --- llvm/test/Instrumentation/InstrProfiling/platform.ll +++ llvm/test/Instrumentation/InstrProfiling/platform.ll @@ -50,7 +50,7 @@ ; SOLARIS-NOT: define internal void @__llvm_profile_register_functions ; PS4-NOT: define internal void @__llvm_profile_register_functions ; WINDOWS-NOT: define internal void @__llvm_profile_register_functions -; AIX: define internal void @__llvm_profile_register_functions +; AIX-NOT: define internal void @__llvm_profile_register_functions ;; PR38340: When dynamic registration is used, we had a bug where we'd register ;; something that's not a __profd_* variable. @@ -61,4 +61,4 @@ ; SOLARIS-NOT: define internal void @__llvm_profile_init ; PS4-NOT: define internal void @__llvm_profile_init ; WINDOWS-NOT: define internal void @__llvm_profile_init -; AIX: define internal void @__llvm_profile_init +; AIX-NOT: define internal void @__llvm_profile_init Index: llvm/test/Instrumentation/InstrProfiling/profiling.ll =================================================================== --- llvm/test/Instrumentation/InstrProfiling/profiling.ll +++ llvm/test/Instrumentation/InstrProfiling/profiling.ll @@ -119,9 +119,4 @@ ; ELF_GENERIC-NEXT: ret void ; ELF_GENERIC-NEXT: } -; XCOFF: define internal void @__llvm_profile_register_functions() unnamed_addr { -; XCOFF-NEXT: call void @__llvm_profile_register_function(i8* bitcast ({ i64, i64, i64, i8*, i8*, i32, [{{.*}} x i16] }* @__profd_foo to i8*)) -; XCOFF-NEXT: call void @__llvm_profile_register_function(i8* bitcast ({ i64, i64, i64, i8*, i8*, i32, [{{.*}} x i16] }* @__profd_foo_weak to i8*)) -; XCOFF: call void @__llvm_profile_register_names_function(i8* getelementptr inbounds {{.*}} @__llvm_prf_nm -; XCOFF-NEXT: ret void -; XCOFF-NEXT: } +; XCOFF-NOT: internal void @__llvm_profile_register_functions()