[compiler-rt] [llvm] [PGO][AMDGPU] Add basic HIP offload PGO support (PR #177665)
Yaxun Liu via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 21 21:41:20 PDT 2026
================
@@ -2179,3 +2396,188 @@ void createProfileSamplingVar(Module &M) {
appendToCompilerUsed(M, SamplingVar);
}
} // namespace llvm
+
+namespace {
+
+// For GPU targets: Allocate contiguous arrays for all profile data.
+// This solves the linker reordering problem by using ONE symbol per section
+// type, so there's nothing for the linker to reorder.
+StructType *InstrLowerer::getProfileDataTy() {
+ if (ProfileDataTy)
+ return ProfileDataTy;
+
+ auto &Ctx = M.getContext();
+ auto *IntPtrTy = M.getDataLayout().getIntPtrType(M.getContext());
+ auto *Int16Ty = Type::getInt16Ty(Ctx);
+ auto *Int16ArrayTy = ArrayType::get(Int16Ty, IPVK_Last + 1);
+ Type *DataTypes[] = {
+#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
+#include "llvm/ProfileData/InstrProfData.inc"
+ };
+ ProfileDataTy = StructType::get(Ctx, ArrayRef(DataTypes));
+ return ProfileDataTy;
+}
+
+void InstrLowerer::cacheGPUCUID() {
+ if (!isGPUProfTarget(M))
+ return;
+ CachedCUID = getCUIDFromModule(M);
+}
+
+// Create CUID-suffixed pointer to __llvm_profile_sections for GPU targets.
+// The basic HIP/offload runtime exposes the original 7-entry section table:
+// names_start, names_stop, cnts_start, cnts_stop, data_start, data_stop,
+// raw_version.
+// We create a per-TU global that points to it, giving the host a unique
+// symbol for shadow variable registration.
+void InstrLowerer::createProfileSectionSymbols() {
+ if (!isGPUProfTarget(M) || CachedCUID.empty())
+ return;
+
+ auto &Ctx = M.getContext();
+ unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
+ auto *Int8PtrTy = PointerType::get(Ctx, AS);
+
+ // __llvm_profile_sections is an array of 7 pointers defined in the GPU
+ // profile runtime (InstrProfilingPlatformGPU.c). Declare it as external.
+ auto *SectionsTy = ArrayType::get(Int8PtrTy, 7);
+ auto *SectionsGV = M.getGlobalVariable("__llvm_profile_sections");
+ if (!SectionsGV) {
+ SectionsGV = new GlobalVariable(M, SectionsTy, /*isConstant=*/true,
+ GlobalValue::ExternalLinkage, nullptr,
+ "__llvm_profile_sections", nullptr,
+ GlobalValue::NotThreadLocal, AS);
+ SectionsGV->setVisibility(GlobalValue::HiddenVisibility);
+ }
+
+ // Create a CUID-suffixed global that stores a pointer to the sections
+ // struct. Aliases can't point to declarations, so we use a pointer global.
+ // The host reads through this indirection: hipGetSymbolAddress gives the
+ // pointer global's device address, then one DtoH copy yields the sections
+ // struct address, then another DtoH copy reads the actual sections.
+ auto *PtrTy = PointerType::get(Ctx, AS);
----------------
yxsamliu wrote:
will use that
https://github.com/llvm/llvm-project/pull/177665
More information about the llvm-commits
mailing list