diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp | 548 | 
1 files changed, 54 insertions, 494 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp index dadc0c92ef8b..b51a876750b5 100644 --- a/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp +++ b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp @@ -49,443 +49,14 @@ namespace AMDGPU {  namespace HSAMD {  //===----------------------------------------------------------------------===// -// HSAMetadataStreamerV2 -//===----------------------------------------------------------------------===// -void MetadataStreamerYamlV2::dump(StringRef HSAMetadataString) const { -  errs() << "AMDGPU HSA Metadata:\n" << HSAMetadataString << '\n'; -} - -void MetadataStreamerYamlV2::verify(StringRef HSAMetadataString) const { -  errs() << "AMDGPU HSA Metadata Parser Test: "; - -  HSAMD::Metadata FromHSAMetadataString; -  if (fromString(HSAMetadataString, FromHSAMetadataString)) { -    errs() << "FAIL\n"; -    return; -  } - -  std::string ToHSAMetadataString; -  if (toString(FromHSAMetadataString, ToHSAMetadataString)) { -    errs() << "FAIL\n"; -    return; -  } - -  errs() << (HSAMetadataString == ToHSAMetadataString ? "PASS" : "FAIL") -         << '\n'; -  if (HSAMetadataString != ToHSAMetadataString) { -    errs() << "Original input: " << HSAMetadataString << '\n' -           << "Produced output: " << ToHSAMetadataString << '\n'; -  } -} - -AccessQualifier -MetadataStreamerYamlV2::getAccessQualifier(StringRef AccQual) const { -  if (AccQual.empty()) -    return AccessQualifier::Unknown; - -  return StringSwitch<AccessQualifier>(AccQual) -             .Case("read_only",  AccessQualifier::ReadOnly) -             .Case("write_only", AccessQualifier::WriteOnly) -             .Case("read_write", AccessQualifier::ReadWrite) -             .Default(AccessQualifier::Default); -} - -AddressSpaceQualifier -MetadataStreamerYamlV2::getAddressSpaceQualifier(unsigned AddressSpace) const { -  switch (AddressSpace) { -  case AMDGPUAS::PRIVATE_ADDRESS: -    return AddressSpaceQualifier::Private; -  case AMDGPUAS::GLOBAL_ADDRESS: -    return AddressSpaceQualifier::Global; -  case AMDGPUAS::CONSTANT_ADDRESS: -    return AddressSpaceQualifier::Constant; -  case AMDGPUAS::LOCAL_ADDRESS: -    return AddressSpaceQualifier::Local; -  case AMDGPUAS::FLAT_ADDRESS: -    return AddressSpaceQualifier::Generic; -  case AMDGPUAS::REGION_ADDRESS: -    return AddressSpaceQualifier::Region; -  default: -    return AddressSpaceQualifier::Unknown; -  } -} - -ValueKind MetadataStreamerYamlV2::getValueKind(Type *Ty, StringRef TypeQual, -                                               StringRef BaseTypeName) const { -  if (TypeQual.contains("pipe")) -    return ValueKind::Pipe; - -  return StringSwitch<ValueKind>(BaseTypeName) -             .Case("image1d_t", ValueKind::Image) -             .Case("image1d_array_t", ValueKind::Image) -             .Case("image1d_buffer_t", ValueKind::Image) -             .Case("image2d_t", ValueKind::Image) -             .Case("image2d_array_t", ValueKind::Image) -             .Case("image2d_array_depth_t", ValueKind::Image) -             .Case("image2d_array_msaa_t", ValueKind::Image) -             .Case("image2d_array_msaa_depth_t", ValueKind::Image) -             .Case("image2d_depth_t", ValueKind::Image) -             .Case("image2d_msaa_t", ValueKind::Image) -             .Case("image2d_msaa_depth_t", ValueKind::Image) -             .Case("image3d_t", ValueKind::Image) -             .Case("sampler_t", ValueKind::Sampler) -             .Case("queue_t", ValueKind::Queue) -             .Default(isa<PointerType>(Ty) ? -                          (Ty->getPointerAddressSpace() == -                           AMDGPUAS::LOCAL_ADDRESS ? -                           ValueKind::DynamicSharedPointer : -                           ValueKind::GlobalBuffer) : -                      ValueKind::ByValue); -} - -std::string MetadataStreamerYamlV2::getTypeName(Type *Ty, bool Signed) const { -  switch (Ty->getTypeID()) { -  case Type::IntegerTyID: { -    if (!Signed) -      return (Twine('u') + getTypeName(Ty, true)).str(); - -    auto BitWidth = Ty->getIntegerBitWidth(); -    switch (BitWidth) { -    case 8: -      return "char"; -    case 16: -      return "short"; -    case 32: -      return "int"; -    case 64: -      return "long"; -    default: -      return (Twine('i') + Twine(BitWidth)).str(); -    } -  } -  case Type::HalfTyID: -    return "half"; -  case Type::FloatTyID: -    return "float"; -  case Type::DoubleTyID: -    return "double"; -  case Type::FixedVectorTyID: { -    auto VecTy = cast<FixedVectorType>(Ty); -    auto ElTy = VecTy->getElementType(); -    auto NumElements = VecTy->getNumElements(); -    return (Twine(getTypeName(ElTy, Signed)) + Twine(NumElements)).str(); -  } -  default: -    return "unknown"; -  } -} - -std::vector<uint32_t> -MetadataStreamerYamlV2::getWorkGroupDimensions(MDNode *Node) const { -  std::vector<uint32_t> Dims; -  if (Node->getNumOperands() != 3) -    return Dims; - -  for (auto &Op : Node->operands()) -    Dims.push_back(mdconst::extract<ConstantInt>(Op)->getZExtValue()); -  return Dims; -} - -Kernel::CodeProps::Metadata MetadataStreamerYamlV2::getHSACodeProps( -    const MachineFunction &MF, const SIProgramInfo &ProgramInfo) const { -  const GCNSubtarget &STM = MF.getSubtarget<GCNSubtarget>(); -  const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>(); -  HSAMD::Kernel::CodeProps::Metadata HSACodeProps; -  const Function &F = MF.getFunction(); - -  assert(F.getCallingConv() == CallingConv::AMDGPU_KERNEL || -         F.getCallingConv() == CallingConv::SPIR_KERNEL); - -  Align MaxKernArgAlign; -  HSACodeProps.mKernargSegmentSize = STM.getKernArgSegmentSize(F, -                                                               MaxKernArgAlign); -  HSACodeProps.mKernargSegmentAlign = -    std::max(MaxKernArgAlign, Align(4)).value(); - -  HSACodeProps.mGroupSegmentFixedSize = ProgramInfo.LDSSize; -  HSACodeProps.mPrivateSegmentFixedSize = ProgramInfo.ScratchSize; -  HSACodeProps.mWavefrontSize = STM.getWavefrontSize(); -  HSACodeProps.mNumSGPRs = ProgramInfo.NumSGPR; -  HSACodeProps.mNumVGPRs = ProgramInfo.NumVGPR; -  HSACodeProps.mMaxFlatWorkGroupSize = MFI.getMaxFlatWorkGroupSize(); -  HSACodeProps.mIsDynamicCallStack = ProgramInfo.DynamicCallStack; -  HSACodeProps.mIsXNACKEnabled = STM.isXNACKEnabled(); -  HSACodeProps.mNumSpilledSGPRs = MFI.getNumSpilledSGPRs(); -  HSACodeProps.mNumSpilledVGPRs = MFI.getNumSpilledVGPRs(); - -  return HSACodeProps; -} - -Kernel::DebugProps::Metadata MetadataStreamerYamlV2::getHSADebugProps( -    const MachineFunction &MF, const SIProgramInfo &ProgramInfo) const { -  return HSAMD::Kernel::DebugProps::Metadata(); -} - -void MetadataStreamerYamlV2::emitVersion() { -  auto &Version = HSAMetadata.mVersion; - -  Version.push_back(VersionMajorV2); -  Version.push_back(VersionMinorV2); -} - -void MetadataStreamerYamlV2::emitPrintf(const Module &Mod) { -  auto &Printf = HSAMetadata.mPrintf; - -  auto Node = Mod.getNamedMetadata("llvm.printf.fmts"); -  if (!Node) -    return; - -  for (auto *Op : Node->operands()) -    if (Op->getNumOperands()) -      Printf.push_back( -          std::string(cast<MDString>(Op->getOperand(0))->getString())); -} - -void MetadataStreamerYamlV2::emitKernelLanguage(const Function &Func) { -  auto &Kernel = HSAMetadata.mKernels.back(); - -  // TODO: What about other languages? -  auto Node = Func.getParent()->getNamedMetadata("opencl.ocl.version"); -  if (!Node || !Node->getNumOperands()) -    return; -  auto Op0 = Node->getOperand(0); -  if (Op0->getNumOperands() <= 1) -    return; - -  Kernel.mLanguage = "OpenCL C"; -  Kernel.mLanguageVersion.push_back( -      mdconst::extract<ConstantInt>(Op0->getOperand(0))->getZExtValue()); -  Kernel.mLanguageVersion.push_back( -      mdconst::extract<ConstantInt>(Op0->getOperand(1))->getZExtValue()); -} - -void MetadataStreamerYamlV2::emitKernelAttrs(const Function &Func) { -  auto &Attrs = HSAMetadata.mKernels.back().mAttrs; - -  if (auto Node = Func.getMetadata("reqd_work_group_size")) -    Attrs.mReqdWorkGroupSize = getWorkGroupDimensions(Node); -  if (auto Node = Func.getMetadata("work_group_size_hint")) -    Attrs.mWorkGroupSizeHint = getWorkGroupDimensions(Node); -  if (auto Node = Func.getMetadata("vec_type_hint")) { -    Attrs.mVecTypeHint = getTypeName( -        cast<ValueAsMetadata>(Node->getOperand(0))->getType(), -        mdconst::extract<ConstantInt>(Node->getOperand(1))->getZExtValue()); -  } -  if (Func.hasFnAttribute("runtime-handle")) { -    Attrs.mRuntimeHandle = -        Func.getFnAttribute("runtime-handle").getValueAsString().str(); -  } -} - -void MetadataStreamerYamlV2::emitKernelArgs(const Function &Func, -                                            const GCNSubtarget &ST) { -  for (auto &Arg : Func.args()) -    emitKernelArg(Arg); - -  emitHiddenKernelArgs(Func, ST); -} - -void MetadataStreamerYamlV2::emitKernelArg(const Argument &Arg) { -  auto Func = Arg.getParent(); -  auto ArgNo = Arg.getArgNo(); -  const MDNode *Node; - -  StringRef Name; -  Node = Func->getMetadata("kernel_arg_name"); -  if (Node && ArgNo < Node->getNumOperands()) -    Name = cast<MDString>(Node->getOperand(ArgNo))->getString(); -  else if (Arg.hasName()) -    Name = Arg.getName(); - -  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"); -  if (Node && ArgNo < Node->getNumOperands()) -    BaseTypeName = cast<MDString>(Node->getOperand(ArgNo))->getString(); - -  StringRef AccQual; -  if (Arg.getType()->isPointerTy() && Arg.onlyReadsMemory() && -      Arg.hasNoAliasAttr()) { -    AccQual = "read_only"; -  } else { -    Node = Func->getMetadata("kernel_arg_access_qual"); -    if (Node && ArgNo < Node->getNumOperands()) -      AccQual = cast<MDString>(Node->getOperand(ArgNo))->getString(); -  } - -  StringRef TypeQual; -  Node = Func->getMetadata("kernel_arg_type_qual"); -  if (Node && ArgNo < Node->getNumOperands()) -    TypeQual = cast<MDString>(Node->getOperand(ArgNo))->getString(); - -  const DataLayout &DL = Func->getParent()->getDataLayout(); - -  MaybeAlign PointeeAlign; -  if (auto PtrTy = dyn_cast<PointerType>(Arg.getType())) { -    if (PtrTy->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS) { -      // FIXME: Should report this for all address spaces -      PointeeAlign = Arg.getParamAlign().valueOrOne(); -    } -  } - -  Type *ArgTy; -  Align ArgAlign; -  std::tie(ArgTy, ArgAlign) = getArgumentTypeAlign(Arg, DL); - -  emitKernelArg(DL, ArgTy, ArgAlign, -                getValueKind(ArgTy, TypeQual, BaseTypeName), PointeeAlign, Name, -                TypeName, BaseTypeName, AccQual, TypeQual); -} - -void MetadataStreamerYamlV2::emitKernelArg( -    const DataLayout &DL, Type *Ty, Align Alignment, ValueKind ValueKind, -    MaybeAlign PointeeAlign, 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 = std::string(Name); -  Arg.mTypeName = std::string(TypeName); -  Arg.mSize = DL.getTypeAllocSize(Ty); -  Arg.mAlign = Alignment.value(); -  Arg.mValueKind = ValueKind; -  Arg.mPointeeAlign = PointeeAlign ? PointeeAlign->value() : 0; - -  if (auto PtrTy = dyn_cast<PointerType>(Ty)) -    Arg.mAddrSpaceQual = getAddressSpaceQualifier(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("restrict", &Arg.mIsRestrict) -                 .Case("volatile", &Arg.mIsVolatile) -                 .Case("pipe",     &Arg.mIsPipe) -                 .Default(nullptr); -    if (P) -      *P = true; -  } -} - -void MetadataStreamerYamlV2::emitHiddenKernelArgs(const Function &Func, -                                                  const GCNSubtarget &ST) { -  unsigned HiddenArgNumBytes = ST.getImplicitArgNumBytes(Func); -  if (!HiddenArgNumBytes) -    return; - -  auto &DL = Func.getParent()->getDataLayout(); -  auto Int64Ty = Type::getInt64Ty(Func.getContext()); - -  if (HiddenArgNumBytes >= 8) -    emitKernelArg(DL, Int64Ty, Align(8), ValueKind::HiddenGlobalOffsetX); -  if (HiddenArgNumBytes >= 16) -    emitKernelArg(DL, Int64Ty, Align(8), ValueKind::HiddenGlobalOffsetY); -  if (HiddenArgNumBytes >= 24) -    emitKernelArg(DL, Int64Ty, Align(8), ValueKind::HiddenGlobalOffsetZ); - -  auto Int8PtrTy = Type::getInt8PtrTy(Func.getContext(), -                                      AMDGPUAS::GLOBAL_ADDRESS); - -  if (HiddenArgNumBytes >= 32) { -    // We forbid the use of features requiring hostcall when compiling OpenCL -    // before code object V5, which makes the mutual exclusion between the -    // "printf buffer" and "hostcall buffer" here sound. -    if (Func.getParent()->getNamedMetadata("llvm.printf.fmts")) -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenPrintfBuffer); -    else if (!Func.hasFnAttribute("amdgpu-no-hostcall-ptr")) -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenHostcallBuffer); -    else -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenNone); -  } - -  // Emit "default queue" and "completion action" arguments if enqueue kernel is -  // used, otherwise emit dummy "none" arguments. -  if (HiddenArgNumBytes >= 40) { -    if (!Func.hasFnAttribute("amdgpu-no-default-queue")) { -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenDefaultQueue); -    } else { -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenNone); -    } -  } - -  if (HiddenArgNumBytes >= 48) { -    if (!Func.hasFnAttribute("amdgpu-no-completion-action")) { -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenCompletionAction); -    } else { -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenNone); -    } -  } - -  // Emit the pointer argument for multi-grid object. -  if (HiddenArgNumBytes >= 56) { -    if (!Func.hasFnAttribute("amdgpu-no-multigrid-sync-arg")) -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenMultiGridSyncArg); -    else -      emitKernelArg(DL, Int8PtrTy, Align(8), ValueKind::HiddenNone); -  } -} - -bool MetadataStreamerYamlV2::emitTo(AMDGPUTargetStreamer &TargetStreamer) { -  return TargetStreamer.EmitHSAMetadata(getHSAMetadata()); -} - -void MetadataStreamerYamlV2::begin(const Module &Mod, -                                   const IsaInfo::AMDGPUTargetID &TargetID) { -  emitVersion(); -  emitPrintf(Mod); -} - -void MetadataStreamerYamlV2::end() { -  std::string HSAMetadataString; -  if (toString(HSAMetadata, HSAMetadataString)) -    return; - -  if (DumpHSAMetadata) -    dump(HSAMetadataString); -  if (VerifyHSAMetadata) -    verify(HSAMetadataString); -} - -void MetadataStreamerYamlV2::emitKernel(const MachineFunction &MF, -                                        const SIProgramInfo &ProgramInfo) { -  auto &Func = MF.getFunction(); -  if (Func.getCallingConv() != CallingConv::AMDGPU_KERNEL) -    return; - -  auto CodeProps = getHSACodeProps(MF, ProgramInfo); -  auto DebugProps = getHSADebugProps(MF, ProgramInfo); - -  HSAMetadata.mKernels.push_back(Kernel::Metadata()); -  auto &Kernel = HSAMetadata.mKernels.back(); - -  const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); -  Kernel.mName = std::string(Func.getName()); -  Kernel.mSymbolName = (Twine(Func.getName()) + Twine("@kd")).str(); -  emitKernelLanguage(Func); -  emitKernelAttrs(Func); -  emitKernelArgs(Func, ST); -  HSAMetadata.mKernels.back().mCodeProps = CodeProps; -  HSAMetadata.mKernels.back().mDebugProps = DebugProps; -} - -//===----------------------------------------------------------------------===// -// HSAMetadataStreamerV3 +// HSAMetadataStreamerV4  //===----------------------------------------------------------------------===// -void MetadataStreamerMsgPackV3::dump(StringRef HSAMetadataString) const { +void MetadataStreamerMsgPackV4::dump(StringRef HSAMetadataString) const {    errs() << "AMDGPU HSA Metadata:\n" << HSAMetadataString << '\n';  } -void MetadataStreamerMsgPackV3::verify(StringRef HSAMetadataString) const { +void MetadataStreamerMsgPackV4::verify(StringRef HSAMetadataString) const {    errs() << "AMDGPU HSA Metadata Parser Test: ";    msgpack::Document FromHSAMetadataString; @@ -507,7 +78,7 @@ void MetadataStreamerMsgPackV3::verify(StringRef HSAMetadataString) const {  }  std::optional<StringRef> -MetadataStreamerMsgPackV3::getAccessQualifier(StringRef AccQual) const { +MetadataStreamerMsgPackV4::getAccessQualifier(StringRef AccQual) const {    return StringSwitch<std::optional<StringRef>>(AccQual)        .Case("read_only", StringRef("read_only"))        .Case("write_only", StringRef("write_only")) @@ -515,7 +86,7 @@ MetadataStreamerMsgPackV3::getAccessQualifier(StringRef AccQual) const {        .Default(std::nullopt);  } -std::optional<StringRef> MetadataStreamerMsgPackV3::getAddressSpaceQualifier( +std::optional<StringRef> MetadataStreamerMsgPackV4::getAddressSpaceQualifier(      unsigned AddressSpace) const {    switch (AddressSpace) {    case AMDGPUAS::PRIVATE_ADDRESS: @@ -536,7 +107,7 @@ std::optional<StringRef> MetadataStreamerMsgPackV3::getAddressSpaceQualifier(  }  StringRef -MetadataStreamerMsgPackV3::getValueKind(Type *Ty, StringRef TypeQual, +MetadataStreamerMsgPackV4::getValueKind(Type *Ty, StringRef TypeQual,                                          StringRef BaseTypeName) const {    if (TypeQual.contains("pipe"))      return "pipe"; @@ -563,7 +134,7 @@ MetadataStreamerMsgPackV3::getValueKind(Type *Ty, StringRef TypeQual,                     : "by_value");  } -std::string MetadataStreamerMsgPackV3::getTypeName(Type *Ty, +std::string MetadataStreamerMsgPackV4::getTypeName(Type *Ty,                                                     bool Signed) const {    switch (Ty->getTypeID()) {    case Type::IntegerTyID: { @@ -602,7 +173,7 @@ std::string MetadataStreamerMsgPackV3::getTypeName(Type *Ty,  }  msgpack::ArrayDocNode -MetadataStreamerMsgPackV3::getWorkGroupDimensions(MDNode *Node) const { +MetadataStreamerMsgPackV4::getWorkGroupDimensions(MDNode *Node) const {    auto Dims = HSAMetadataDoc->getArrayNode();    if (Node->getNumOperands() != 3)      return Dims; @@ -613,14 +184,20 @@ MetadataStreamerMsgPackV3::getWorkGroupDimensions(MDNode *Node) const {    return Dims;  } -void MetadataStreamerMsgPackV3::emitVersion() { +void MetadataStreamerMsgPackV4::emitVersion() {    auto Version = HSAMetadataDoc->getArrayNode(); -  Version.push_back(Version.getDocument()->getNode(VersionMajorV3)); -  Version.push_back(Version.getDocument()->getNode(VersionMinorV3)); +  Version.push_back(Version.getDocument()->getNode(VersionMajorV4)); +  Version.push_back(Version.getDocument()->getNode(VersionMinorV4));    getRootMetadata("amdhsa.version") = Version;  } -void MetadataStreamerMsgPackV3::emitPrintf(const Module &Mod) { +void MetadataStreamerMsgPackV4::emitTargetID( +    const IsaInfo::AMDGPUTargetID &TargetID) { +  getRootMetadata("amdhsa.target") = +      HSAMetadataDoc->getNode(TargetID.toString(), /*Copy=*/true); +} + +void MetadataStreamerMsgPackV4::emitPrintf(const Module &Mod) {    auto Node = Mod.getNamedMetadata("llvm.printf.fmts");    if (!Node)      return; @@ -633,7 +210,7 @@ void MetadataStreamerMsgPackV3::emitPrintf(const Module &Mod) {    getRootMetadata("amdhsa.printf") = Printf;  } -void MetadataStreamerMsgPackV3::emitKernelLanguage(const Function &Func, +void MetadataStreamerMsgPackV4::emitKernelLanguage(const Function &Func,                                                     msgpack::MapDocNode Kern) {    // TODO: What about other languages?    auto Node = Func.getParent()->getNamedMetadata("opencl.ocl.version"); @@ -652,7 +229,7 @@ void MetadataStreamerMsgPackV3::emitKernelLanguage(const Function &Func,    Kern[".language_version"] = LanguageVersion;  } -void MetadataStreamerMsgPackV3::emitKernelAttrs(const Function &Func, +void MetadataStreamerMsgPackV4::emitKernelAttrs(const Function &Func,                                                  msgpack::MapDocNode Kern) {    if (auto Node = Func.getMetadata("reqd_work_group_size")) @@ -677,7 +254,7 @@ void MetadataStreamerMsgPackV3::emitKernelAttrs(const Function &Func,      Kern[".kind"] = Kern.getDocument()->getNode("fini");  } -void MetadataStreamerMsgPackV3::emitKernelArgs(const MachineFunction &MF, +void MetadataStreamerMsgPackV4::emitKernelArgs(const MachineFunction &MF,                                                 msgpack::MapDocNode Kern) {    auto &Func = MF.getFunction();    unsigned Offset = 0; @@ -690,7 +267,7 @@ void MetadataStreamerMsgPackV3::emitKernelArgs(const MachineFunction &MF,    Kern[".args"] = Args;  } -void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg, +void MetadataStreamerMsgPackV4::emitKernelArg(const Argument &Arg,                                                unsigned &Offset,                                                msgpack::ArrayDocNode Args) {    auto Func = Arg.getParent(); @@ -714,16 +291,20 @@ void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,    if (Node && ArgNo < Node->getNumOperands())      BaseTypeName = cast<MDString>(Node->getOperand(ArgNo))->getString(); -  StringRef AccQual; -  if (Arg.getType()->isPointerTy() && Arg.onlyReadsMemory() && -      Arg.hasNoAliasAttr()) { -    AccQual = "read_only"; -  } else { -    Node = Func->getMetadata("kernel_arg_access_qual"); -    if (Node && ArgNo < Node->getNumOperands()) -      AccQual = cast<MDString>(Node->getOperand(ArgNo))->getString(); +  StringRef ActAccQual; +  // Do we really need NoAlias check here? +  if (Arg.getType()->isPointerTy() && Arg.hasNoAliasAttr()) { +    if (Arg.onlyReadsMemory()) +      ActAccQual = "read_only"; +    else if (Arg.hasAttribute(Attribute::WriteOnly)) +      ActAccQual = "write_only";    } +  StringRef AccQual; +  Node = Func->getMetadata("kernel_arg_access_qual"); +  if (Node && ArgNo < Node->getNumOperands()) +    AccQual = cast<MDString>(Node->getOperand(ArgNo))->getString(); +    StringRef TypeQual;    Node = Func->getMetadata("kernel_arg_type_qual");    if (Node && ArgNo < Node->getNumOperands()) @@ -747,14 +328,15 @@ void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,    emitKernelArg(DL, ArgTy, ArgAlign,                  getValueKind(ArgTy, TypeQual, BaseTypeName), Offset, Args, -                PointeeAlign, Name, TypeName, BaseTypeName, AccQual, TypeQual); +                PointeeAlign, Name, TypeName, BaseTypeName, ActAccQual, +                AccQual, TypeQual);  } -void MetadataStreamerMsgPackV3::emitKernelArg( +void MetadataStreamerMsgPackV4::emitKernelArg(      const DataLayout &DL, Type *Ty, Align Alignment, StringRef ValueKind,      unsigned &Offset, msgpack::ArrayDocNode Args, MaybeAlign PointeeAlign,      StringRef Name, StringRef TypeName, StringRef BaseTypeName, -    StringRef AccQual, StringRef TypeQual) { +    StringRef ActAccQual, StringRef AccQual, StringRef TypeQual) {    auto Arg = Args.getDocument()->getMapNode();    if (!Name.empty()) @@ -780,7 +362,8 @@ void MetadataStreamerMsgPackV3::emitKernelArg(    if (auto AQ = getAccessQualifier(AccQual))      Arg[".access"] = Arg.getDocument()->getNode(*AQ, /*Copy=*/true); -  // TODO: Emit Arg[".actual_access"]. +  if (auto AAQ = getAccessQualifier(ActAccQual)) +    Arg[".actual_access"] = Arg.getDocument()->getNode(*AAQ, /*Copy=*/true);    SmallVector<StringRef, 1> SplitTypeQuals;    TypeQual.split(SplitTypeQuals, " ", -1, false); @@ -798,7 +381,7 @@ void MetadataStreamerMsgPackV3::emitKernelArg(    Args.push_back(Arg);  } -void MetadataStreamerMsgPackV3::emitHiddenKernelArgs( +void MetadataStreamerMsgPackV4::emitHiddenKernelArgs(      const MachineFunction &MF, unsigned &Offset, msgpack::ArrayDocNode Args) {    auto &Func = MF.getFunction();    const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); @@ -824,7 +407,7 @@ void MetadataStreamerMsgPackV3::emitHiddenKernelArgs(                    Args);    auto Int8PtrTy = -      Type::getInt8PtrTy(Func.getContext(), AMDGPUAS::GLOBAL_ADDRESS); +      PointerType::get(Func.getContext(), AMDGPUAS::GLOBAL_ADDRESS);    if (HiddenArgNumBytes >= 32) {      // We forbid the use of features requiring hostcall when compiling OpenCL @@ -871,9 +454,10 @@ void MetadataStreamerMsgPackV3::emitHiddenKernelArgs(    }  } -msgpack::MapDocNode MetadataStreamerMsgPackV3::getHSAKernelProps( -    const MachineFunction &MF, const SIProgramInfo &ProgramInfo, -    unsigned CodeObjectVersion) const { +msgpack::MapDocNode +MetadataStreamerMsgPackV4::getHSAKernelProps(const MachineFunction &MF, +                                             const SIProgramInfo &ProgramInfo, +                                             unsigned CodeObjectVersion) const {    const GCNSubtarget &STM = MF.getSubtarget<GCNSubtarget>();    const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();    const Function &F = MF.getFunction(); @@ -918,18 +502,19 @@ msgpack::MapDocNode MetadataStreamerMsgPackV3::getHSAKernelProps(    return Kern;  } -bool MetadataStreamerMsgPackV3::emitTo(AMDGPUTargetStreamer &TargetStreamer) { +bool MetadataStreamerMsgPackV4::emitTo(AMDGPUTargetStreamer &TargetStreamer) {    return TargetStreamer.EmitHSAMetadata(*HSAMetadataDoc, true);  } -void MetadataStreamerMsgPackV3::begin(const Module &Mod, +void MetadataStreamerMsgPackV4::begin(const Module &Mod,                                        const IsaInfo::AMDGPUTargetID &TargetID) {    emitVersion(); +  emitTargetID(TargetID);    emitPrintf(Mod);    getRootMetadata("amdhsa.kernels") = HSAMetadataDoc->getArrayNode();  } -void MetadataStreamerMsgPackV3::end() { +void MetadataStreamerMsgPackV4::end() {    std::string HSAMetadataString;    raw_string_ostream StrOS(HSAMetadataString);    HSAMetadataDoc->toYAML(StrOS); @@ -940,7 +525,7 @@ void MetadataStreamerMsgPackV3::end() {      verify(StrOS.str());  } -void MetadataStreamerMsgPackV3::emitKernel(const MachineFunction &MF, +void MetadataStreamerMsgPackV4::emitKernel(const MachineFunction &MF,                                             const SIProgramInfo &ProgramInfo) {    auto &Func = MF.getFunction();    if (Func.getCallingConv() != CallingConv::AMDGPU_KERNEL && @@ -966,31 +551,6 @@ void MetadataStreamerMsgPackV3::emitKernel(const MachineFunction &MF,  }  //===----------------------------------------------------------------------===// -// HSAMetadataStreamerV4 -//===----------------------------------------------------------------------===// - -void MetadataStreamerMsgPackV4::emitVersion() { -  auto Version = HSAMetadataDoc->getArrayNode(); -  Version.push_back(Version.getDocument()->getNode(VersionMajorV4)); -  Version.push_back(Version.getDocument()->getNode(VersionMinorV4)); -  getRootMetadata("amdhsa.version") = Version; -} - -void MetadataStreamerMsgPackV4::emitTargetID( -    const IsaInfo::AMDGPUTargetID &TargetID) { -  getRootMetadata("amdhsa.target") = -      HSAMetadataDoc->getNode(TargetID.toString(), /*Copy=*/true); -} - -void MetadataStreamerMsgPackV4::begin(const Module &Mod, -                                      const IsaInfo::AMDGPUTargetID &TargetID) { -  emitVersion(); -  emitTargetID(TargetID); -  emitPrintf(Mod); -  getRootMetadata("amdhsa.kernels") = HSAMetadataDoc->getArrayNode(); -} - -//===----------------------------------------------------------------------===//  // HSAMetadataStreamerV5  //===----------------------------------------------------------------------===// @@ -1044,7 +604,7 @@ void MetadataStreamerMsgPackV5::emitHiddenKernelArgs(    Offset += 6; // Reserved.    auto Int8PtrTy = -      Type::getInt8PtrTy(Func.getContext(), AMDGPUAS::GLOBAL_ADDRESS); +      PointerType::get(Func.getContext(), AMDGPUAS::GLOBAL_ADDRESS);    if (M->getNamedMetadata("llvm.printf.fmts")) {      emitKernelArg(DL, Int8PtrTy, Align(8), "hidden_printf_buffer", Offset, @@ -1097,13 +657,13 @@ void MetadataStreamerMsgPackV5::emitHiddenKernelArgs(      Offset += 8; // Skipped.    } -  if (MFI.hasQueuePtr()) +  if (MFI.getUserSGPRInfo().hasQueuePtr())      emitKernelArg(DL, Int8PtrTy, Align(8), "hidden_queue_ptr", Offset, Args);  }  void MetadataStreamerMsgPackV5::emitKernelAttrs(const Function &Func,                                                  msgpack::MapDocNode Kern) { -  MetadataStreamerMsgPackV3::emitKernelAttrs(Func, Kern); +  MetadataStreamerMsgPackV4::emitKernelAttrs(Func, Kern);    if (Func.getFnAttribute("uniform-work-group-size").getValueAsBool())      Kern[".uniform_work_group_size"] = Kern.getDocument()->getNode(1);  | 
