summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Support/AMDGPUMetadata.cpp51
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp51
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h7
-rw-r--r--llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.cpp92
-rw-r--r--llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.h14
5 files changed, 121 insertions, 94 deletions
diff --git a/llvm/lib/Support/AMDGPUMetadata.cpp b/llvm/lib/Support/AMDGPUMetadata.cpp
index 00fa91a7cf0..8a58f91b37a 100644
--- a/llvm/lib/Support/AMDGPUMetadata.cpp
+++ b/llvm/lib/Support/AMDGPUMetadata.cpp
@@ -104,46 +104,50 @@ struct MappingTraits<Kernel::Attrs::Metadata> {
template <>
struct MappingTraits<Kernel::Arg::Metadata> {
static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) {
+ YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
+ YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize);
YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign);
YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind);
YIO.mapRequired(Kernel::Arg::Key::ValueType, MD.mValueType);
YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign,
uint32_t(0));
- YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
- AccessQualifier::Unknown);
YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual,
AddressSpaceQualifier::Unknown);
+ YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
+ AccessQualifier::Unknown);
+ YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual,
+ AccessQualifier::Unknown);
YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false);
- YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false);
YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false);
- YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
- YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
+ YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
}
};
template <>
struct MappingTraits<Kernel::CodeProps::Metadata> {
static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) {
- YIO.mapOptional(Kernel::CodeProps::Key::KernargSegmentSize,
- MD.mKernargSegmentSize, uint64_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::WorkgroupGroupSegmentSize,
- MD.mWorkgroupGroupSegmentSize, uint32_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::WorkitemPrivateSegmentSize,
- MD.mWorkitemPrivateSegmentSize, uint32_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::WavefrontNumSGPRs,
- MD.mWavefrontNumSGPRs, uint16_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::WorkitemNumVGPRs,
- MD.mWorkitemNumVGPRs, uint16_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::KernargSegmentAlign,
- MD.mKernargSegmentAlign, uint8_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::GroupSegmentAlign,
- MD.mGroupSegmentAlign, uint8_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::PrivateSegmentAlign,
- MD.mPrivateSegmentAlign, uint8_t(0));
- YIO.mapOptional(Kernel::CodeProps::Key::WavefrontSize,
- MD.mWavefrontSize, uint8_t(0));
+ YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize,
+ MD.mKernargSegmentSize);
+ YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize,
+ MD.mGroupSegmentFixedSize);
+ YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize,
+ MD.mPrivateSegmentFixedSize);
+ YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign,
+ MD.mKernargSegmentAlign);
+ YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize,
+ MD.mWavefrontSize);
+ YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs,
+ MD.mNumSGPRs, uint16_t(0));
+ YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs,
+ MD.mNumVGPRs, uint16_t(0));
+ YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkgroupSize,
+ MD.mMaxFlatWorkgroupSize, uint32_t(0));
+ YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack,
+ MD.mIsDynamicCallStack, false);
+ YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled,
+ MD.mIsXNACKEnabled, false);
}
};
@@ -167,6 +171,7 @@ template <>
struct MappingTraits<Kernel::Metadata> {
static void mapping(IO &YIO, Kernel::Metadata &MD) {
YIO.mapRequired(Kernel::Key::Name, MD.mName);
+ YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName);
YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string());
YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion,
std::vector<uint32_t>());
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
index ca828b45c54..b3650b4ac89 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
@@ -199,7 +199,9 @@ void AMDGPUAsmPrinter::EmitFunctionBodyStart() {
if (TM.getTargetTriple().getOS() != Triple::AMDHSA)
return;
- HSAMetadataStream.emitKernel(*MF->getFunction(), KernelCode);
+ HSAMetadataStream.emitKernel(*MF->getFunction(),
+ getHSACodeProps(*MF, CurrentProgramInfo),
+ getHSADebugProps(*MF, CurrentProgramInfo));
}
void AMDGPUAsmPrinter::EmitFunctionEntryLabel() {
@@ -1155,6 +1157,53 @@ void AMDGPUAsmPrinter::getAmdKernelCode(amd_kernel_code_t &Out,
}
}
+AMDGPU::HSAMD::Kernel::CodeProps::Metadata AMDGPUAsmPrinter::getHSACodeProps(
+ const MachineFunction &MF,
+ const SIProgramInfo &ProgramInfo) const {
+ const SISubtarget &STM = MF.getSubtarget<SISubtarget>();
+ const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
+ HSAMD::Kernel::CodeProps::Metadata HSACodeProps;
+
+ HSACodeProps.mKernargSegmentSize =
+ STM.getKernArgSegmentSize(MF, MFI.getABIArgOffset());
+ HSACodeProps.mGroupSegmentFixedSize = ProgramInfo.LDSSize;
+ HSACodeProps.mPrivateSegmentFixedSize = ProgramInfo.ScratchSize;
+ HSACodeProps.mKernargSegmentAlign =
+ std::max(uint32_t(4), MFI.getMaxKernArgAlign());
+ HSACodeProps.mWavefrontSize = STM.getWavefrontSize();
+ HSACodeProps.mNumSGPRs = CurrentProgramInfo.NumSGPR;
+ HSACodeProps.mNumVGPRs = CurrentProgramInfo.NumVGPR;
+ // TODO: Emit HSACodeProps.mMaxFlatWorkgroupSize.
+ HSACodeProps.mIsDynamicCallStack = ProgramInfo.DynamicCallStack;
+ HSACodeProps.mIsXNACKEnabled = STM.isXNACKEnabled();
+
+ return HSACodeProps;
+}
+
+AMDGPU::HSAMD::Kernel::DebugProps::Metadata AMDGPUAsmPrinter::getHSADebugProps(
+ const MachineFunction &MF,
+ const SIProgramInfo &ProgramInfo) const {
+ const SISubtarget &STM = MF.getSubtarget<SISubtarget>();
+ HSAMD::Kernel::DebugProps::Metadata HSADebugProps;
+
+ if (!STM.debuggerSupported())
+ return HSADebugProps;
+
+ HSADebugProps.mDebuggerABIVersion.push_back(1);
+ HSADebugProps.mDebuggerABIVersion.push_back(0);
+ HSADebugProps.mReservedNumVGPRs = ProgramInfo.ReservedVGPRCount;
+ HSADebugProps.mReservedFirstVGPR = ProgramInfo.ReservedVGPRFirst;
+
+ if (STM.debuggerEmitPrologue()) {
+ HSADebugProps.mPrivateSegmentBufferSGPR =
+ ProgramInfo.DebuggerPrivateSegmentBufferSGPR;
+ HSADebugProps.mWavefrontPrivateSegmentOffsetSGPR =
+ ProgramInfo.DebuggerWavefrontPrivateSegmentOffsetSGPR;
+ }
+
+ return HSADebugProps;
+}
+
bool AMDGPUAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
unsigned AsmVariant,
const char *ExtraCode, raw_ostream &O) {
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
index 88503e75dd2..74e38455058 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
@@ -128,6 +128,13 @@ private:
unsigned &NumSGPR,
unsigned &NumVGPR) const;
+ AMDGPU::HSAMD::Kernel::CodeProps::Metadata getHSACodeProps(
+ const MachineFunction &MF,
+ const SIProgramInfo &ProgramInfo) const;
+ AMDGPU::HSAMD::Kernel::DebugProps::Metadata getHSADebugProps(
+ const MachineFunction &MF,
+ const SIProgramInfo &ProgramInfo) const;
+
/// \brief Emit register usage information so that the GPU driver
/// can correctly setup the GPU state.
void EmitProgramInfoR600(const MachineFunction &MF);
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.cpp
index 7dda7c16651..dacf5d37aa1 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.cpp
@@ -279,10 +279,15 @@ void MetadataStreamer::emitKernelArg(const Argument &Arg) {
auto ArgNo = Arg.getArgNo();
const MDNode *Node;
- StringRef TypeQual;
- Node = Func->getMetadata("kernel_arg_type_qual");
+ StringRef Name;
+ Node = Func->getMetadata("kernel_arg_name");
if (Node && ArgNo < Node->getNumOperands())
- TypeQual = cast<MDString>(Node->getOperand(ArgNo))->getString();
+ Name = cast<MDString>(Node->getOperand(ArgNo))->getString();
+
+ StringRef TypeName;
+ Node = Func->getMetadata("kernel_arg_type");
+ if (Node && ArgNo < Node->getNumOperands())
+ TypeName = cast<MDString>(Node->getOperand(ArgNo))->getString();
StringRef BaseTypeName;
Node = Func->getMetadata("kernel_arg_base_type");
@@ -299,28 +304,25 @@ void MetadataStreamer::emitKernelArg(const Argument &Arg) {
AccQual = cast<MDString>(Node->getOperand(ArgNo))->getString();
}
- StringRef Name;
- Node = Func->getMetadata("kernel_arg_name");
- if (Node && ArgNo < Node->getNumOperands())
- Name = cast<MDString>(Node->getOperand(ArgNo))->getString();
-
- StringRef TypeName;
- Node = Func->getMetadata("kernel_arg_type");
+ StringRef TypeQual;
+ Node = Func->getMetadata("kernel_arg_type_qual");
if (Node && ArgNo < Node->getNumOperands())
- TypeName = cast<MDString>(Node->getOperand(ArgNo))->getString();
+ TypeQual = cast<MDString>(Node->getOperand(ArgNo))->getString();
emitKernelArg(Func->getParent()->getDataLayout(), Arg.getType(),
- getValueKind(Arg.getType(), TypeQual, BaseTypeName), TypeQual,
- BaseTypeName, AccQual, Name, TypeName);
+ getValueKind(Arg.getType(), TypeQual, BaseTypeName), Name,
+ TypeName, BaseTypeName, AccQual, TypeQual);
}
void MetadataStreamer::emitKernelArg(const DataLayout &DL, Type *Ty,
- ValueKind ValueKind, StringRef TypeQual,
- StringRef BaseTypeName, StringRef AccQual,
- StringRef Name, StringRef TypeName) {
+ ValueKind ValueKind, StringRef Name,
+ StringRef TypeName, StringRef BaseTypeName,
+ StringRef AccQual, StringRef TypeQual) {
HSAMetadata.mKernels.back().mArgs.push_back(Kernel::Arg::Metadata());
auto &Arg = HSAMetadata.mKernels.back().mArgs.back();
+ Arg.mName = Name;
+ Arg.mTypeName = TypeName;
Arg.mSize = DL.getTypeAllocSize(Ty);
Arg.mAlign = DL.getABITypeAlignment(Ty);
Arg.mValueKind = ValueKind;
@@ -332,62 +334,25 @@ void MetadataStreamer::emitKernelArg(const DataLayout &DL, Type *Ty,
Arg.mPointeeAlign = DL.getABITypeAlignment(ElTy);
}
- Arg.mAccQual = getAccessQualifier(AccQual);
-
if (auto PtrTy = dyn_cast<PointerType>(Ty))
Arg.mAddrSpaceQual = getAddressSpaceQualifer(PtrTy->getAddressSpace());
+ Arg.mAccQual = getAccessQualifier(AccQual);
+
+ // TODO: Emit Arg.mActualAccQual.
+
SmallVector<StringRef, 1> SplitTypeQuals;
TypeQual.split(SplitTypeQuals, " ", -1, false);
for (StringRef Key : SplitTypeQuals) {
auto P = StringSwitch<bool*>(Key)
.Case("const", &Arg.mIsConst)
- .Case("pipe", &Arg.mIsPipe)
.Case("restrict", &Arg.mIsRestrict)
.Case("volatile", &Arg.mIsVolatile)
+ .Case("pipe", &Arg.mIsPipe)
.Default(nullptr);
if (P)
*P = true;
}
-
- Arg.mName = Name;
- Arg.mTypeName = TypeName;
-}
-
-void MetadataStreamer::emitKernelCodeProps(
- const amd_kernel_code_t &KernelCode) {
- auto &CodeProps = HSAMetadata.mKernels.back().mCodeProps;
-
- CodeProps.mKernargSegmentSize = KernelCode.kernarg_segment_byte_size;
- CodeProps.mWorkgroupGroupSegmentSize =
- KernelCode.workgroup_group_segment_byte_size;
- CodeProps.mWorkitemPrivateSegmentSize =
- KernelCode.workitem_private_segment_byte_size;
- CodeProps.mWavefrontNumSGPRs = KernelCode.wavefront_sgpr_count;
- CodeProps.mWorkitemNumVGPRs = KernelCode.workitem_vgpr_count;
- CodeProps.mKernargSegmentAlign = KernelCode.kernarg_segment_alignment;
- CodeProps.mGroupSegmentAlign = KernelCode.group_segment_alignment;
- CodeProps.mPrivateSegmentAlign = KernelCode.private_segment_alignment;
- CodeProps.mWavefrontSize = KernelCode.wavefront_size;
-}
-
-void MetadataStreamer::emitKernelDebugProps(
- const amd_kernel_code_t &KernelCode) {
- if (!(KernelCode.code_properties & AMD_CODE_PROPERTY_IS_DEBUG_SUPPORTED))
- return;
-
- auto &DebugProps = HSAMetadata.mKernels.back().mDebugProps;
-
- // FIXME: Need to pass down debugger ABI version through features. This is ok
- // for now because we only have one version.
- DebugProps.mDebuggerABIVersion.push_back(1);
- DebugProps.mDebuggerABIVersion.push_back(0);
- DebugProps.mReservedNumVGPRs = KernelCode.reserved_vgpr_count;
- DebugProps.mReservedFirstVGPR = KernelCode.reserved_vgpr_first;
- DebugProps.mPrivateSegmentBufferSGPR =
- KernelCode.debug_private_segment_buffer_sgpr;
- DebugProps.mWavefrontPrivateSegmentOffsetSGPR =
- KernelCode.debug_wavefront_private_segment_offset_sgpr;
}
void MetadataStreamer::begin(const Module &Mod) {
@@ -407,8 +372,10 @@ void MetadataStreamer::end() {
verify(HSAMetadataString);
}
-void MetadataStreamer::emitKernel(const Function &Func,
- const amd_kernel_code_t &KernelCode) {
+void MetadataStreamer::emitKernel(
+ const Function &Func,
+ const Kernel::CodeProps::Metadata &CodeProps,
+ const Kernel::DebugProps::Metadata &DebugProps) {
if (Func.getCallingConv() != CallingConv::AMDGPU_KERNEL)
return;
@@ -416,11 +383,12 @@ void MetadataStreamer::emitKernel(const Function &Func,
auto &Kernel = HSAMetadata.mKernels.back();
Kernel.mName = Func.getName();
+ Kernel.mSymbolName = (Twine(Func.getName()) + Twine("@kd")).str();
emitKernelLanguage(Func);
emitKernelAttrs(Func);
emitKernelArgs(Func);
- emitKernelCodeProps(KernelCode);
- emitKernelDebugProps(KernelCode);
+ HSAMetadata.mKernels.back().mCodeProps = CodeProps;
+ HSAMetadata.mKernels.back().mDebugProps = DebugProps;
}
} // end namespace HSAMD
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.h
index 6a101d12914..bd6515521a7 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.h
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUHSAMetadataStreamer.h
@@ -68,13 +68,9 @@ private:
void emitKernelArg(const Argument &Arg);
void emitKernelArg(const DataLayout &DL, Type *Ty, ValueKind ValueKind,
- StringRef TypeQual = "", StringRef BaseTypeName = "",
- StringRef AccQual = "", StringRef Name = "",
- StringRef TypeName = "");
-
- void emitKernelCodeProps(const amd_kernel_code_t &KernelCode);
-
- void emitKernelDebugProps(const amd_kernel_code_t &KernelCode);
+ StringRef Name = "", StringRef TypeName = "",
+ StringRef BaseTypeName = "", StringRef AccQual = "",
+ StringRef TypeQual = "");
public:
MetadataStreamer() = default;
@@ -88,7 +84,9 @@ public:
void end();
- void emitKernel(const Function &Func, const amd_kernel_code_t &KernelCode);
+ void emitKernel(const Function &Func,
+ const Kernel::CodeProps::Metadata &CodeProps,
+ const Kernel::DebugProps::Metadata &DebugProps);
};
} // end namespace HSAMD
OpenPOWER on IntegriCloud