diff options
| author | Konstantin Zhuravlyov <kzhuravl_dev@outlook.com> | 2017-02-27 07:55:17 +0000 |
|---|---|---|
| committer | Konstantin Zhuravlyov <kzhuravl_dev@outlook.com> | 2017-02-27 07:55:17 +0000 |
| commit | 972948b36eecc591cff85391bf11635750c1c88e (patch) | |
| tree | 8ab64d2de4b2a745e0dbfd18bea623103fba2189 /llvm/lib | |
| parent | 50aa37b96cf9686b87ef675f3614ab5980e33d3b (diff) | |
| download | bcm5719-llvm-972948b36eecc591cff85391bf11635750c1c88e.tar.gz bcm5719-llvm-972948b36eecc591cff85391bf11635750c1c88e.zip | |
[AMDGPU] Runtime metadata fixes:
- Verify that runtime metadata is actually valid runtime metadata when assembling, otherwise we could accept the following when assembling, but ocl runtime will reject it:
.amdgpu_runtime_metadata
{ amd.MDVersion: [ 2, 1 ], amd.RandomUnknownKey, amd.IsaInfo: ...
- Make IsaInfo optional, and always emit it.
Differential Revision: https://reviews.llvm.org/D30349
llvm-svn: 296324
Diffstat (limited to 'llvm/lib')
5 files changed, 79 insertions, 32 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 0f0e0ab68c9..b2135d518d1 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -789,12 +789,12 @@ public: : MCTargetAsmParser(Options, STI), MII(MII), Parser(_Parser) { MCAsmParserExtension::Initialize(Parser); - if (getSTI().getFeatureBits().none()) { + if (getFeatureBits().none()) { // Set default features. copySTI().ToggleFeature("SOUTHERN_ISLANDS"); } - setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits())); + setAvailableFeatures(ComputeAvailableFeatures(getFeatureBits())); { // TODO: make those pre-defined variables read-only. @@ -802,7 +802,7 @@ public: // MCSymbol::isRedefinable is intended for another purpose, and // AsmParser::parseDirectiveSet() cannot be specialized for specific target. AMDGPU::IsaInfo::IsaVersion ISA = - AMDGPU::IsaInfo::getIsaVersion(getSTI().getFeatureBits()); + AMDGPU::IsaInfo::getIsaVersion(getFeatureBits()); MCContext &Ctx = getContext(); MCSymbol *Sym = Ctx.getOrCreateSymbol(Twine(".option.machine_version_major")); @@ -828,7 +828,7 @@ public: } bool hasInv2PiInlineImm() const { - return getSTI().getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm]; + return getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm]; } bool hasSGPR102_SGPR103() const { @@ -850,6 +850,10 @@ public: return &MII; } + const FeatureBitset &getFeatureBits() const { + return getSTI().getFeatureBits(); + } + void setForcedEncodingSize(unsigned Size) { ForcedEncodingSize = Size; } void setForcedDPP(bool ForceDPP_) { ForcedDPP = ForceDPP_; } void setForcedSDWA(bool ForceSDWA_) { ForcedSDWA = ForceSDWA_; } @@ -1870,7 +1874,7 @@ bool AMDGPUAsmParser::ParseDirectiveHSACodeObjectISA() { // targeted GPU. if (getLexer().is(AsmToken::EndOfStatement)) { AMDGPU::IsaInfo::IsaVersion ISA = - AMDGPU::IsaInfo::getIsaVersion(getSTI().getFeatureBits()); + AMDGPU::IsaInfo::getIsaVersion(getFeatureBits()); getTargetStreamer().EmitDirectiveHSACodeObjectISA(ISA.Major, ISA.Minor, ISA.Stepping, "AMD", "AMDGPU"); @@ -1947,7 +1951,8 @@ bool AMDGPUAsmParser::ParseDirectiveRuntimeMetadata() { MS.flush(); - getTargetStreamer().EmitRuntimeMetadata(Metadata); + if (getTargetStreamer().EmitRuntimeMetadata(getFeatureBits(), Metadata)) + return Error(getParser().getTok().getLoc(), "invalid runtime metadata"); return false; } @@ -1965,7 +1970,7 @@ bool AMDGPUAsmParser::ParseAMDKernelCodeTValue(StringRef ID, bool AMDGPUAsmParser::ParseDirectiveAMDKernelCodeT() { amd_kernel_code_t Header; - AMDGPU::initDefaultAMDKernelCodeT(Header, getSTI().getFeatureBits()); + AMDGPU::initDefaultAMDKernelCodeT(Header, getFeatureBits()); while (true) { // Lex EndOfStatement. This is in a while loop, because lexing a comment @@ -2459,7 +2464,7 @@ bool AMDGPUAsmParser::parseCnt(int64_t &IntVal) { Parser.Lex(); AMDGPU::IsaInfo::IsaVersion ISA = - AMDGPU::IsaInfo::getIsaVersion(getSTI().getFeatureBits()); + AMDGPU::IsaInfo::getIsaVersion(getFeatureBits()); if (CntName == "vmcnt") IntVal = encodeVmcnt(ISA, IntVal, CntVal); else if (CntName == "expcnt") @@ -2475,7 +2480,7 @@ bool AMDGPUAsmParser::parseCnt(int64_t &IntVal) { OperandMatchResultTy AMDGPUAsmParser::parseSWaitCntOps(OperandVector &Operands) { AMDGPU::IsaInfo::IsaVersion ISA = - AMDGPU::IsaInfo::getIsaVersion(getSTI().getFeatureBits()); + AMDGPU::IsaInfo::getIsaVersion(getFeatureBits()); int64_t Waitcnt = getWaitcntBitMask(ISA); SMLoc S = Parser.getTok().getLoc(); diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp index 9bd8eddb60a..0e87d750f5d 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp @@ -38,6 +38,7 @@ #include <vector> using namespace llvm; +using namespace llvm::AMDGPU::IsaInfo; using namespace ::AMDGPU::RuntimeMD; static cl::opt<bool> @@ -88,7 +89,7 @@ template <> struct MappingTraits<Kernel::Metadata> { INVALID_KERNEL_INDEX); YamlIO.mapOptional(KeyName::NoPartialWorkGroups, K.NoPartialWorkGroups, uint8_t(0)); - YamlIO.mapRequired(KeyName::Args, K.Args); + YamlIO.mapOptional(KeyName::Args, K.Args); } static const bool flow = true; }; @@ -116,7 +117,7 @@ template <> struct MappingTraits<IsaInfo::Metadata> { template <> struct MappingTraits<Program::Metadata> { static void mapping(IO &YamlIO, Program::Metadata &Prog) { YamlIO.mapRequired(KeyName::MDVersion, Prog.MDVersionSeq); - YamlIO.mapRequired(KeyName::IsaInfo, Prog.IsaInfo); + YamlIO.mapOptional(KeyName::IsaInfo, Prog.IsaInfo); YamlIO.mapOptional(KeyName::PrintfInfo, Prog.PrintfInfo); YamlIO.mapOptional(KeyName::Kernels, Prog.Kernels); } @@ -375,6 +376,20 @@ static Kernel::Metadata getRuntimeMDForKernel(const Function &F) { return Kernel; } +static void getIsaInfo(const FeatureBitset &Features, IsaInfo::Metadata &IIM) { + IIM.WavefrontSize = getWavefrontSize(Features); + IIM.LocalMemorySize = getLocalMemorySize(Features); + IIM.EUsPerCU = getEUsPerCU(Features); + IIM.MaxWavesPerEU = getMaxWavesPerEU(Features); + IIM.MaxFlatWorkGroupSize = getMaxFlatWorkGroupSize(Features); + IIM.SGPRAllocGranule = getSGPRAllocGranule(Features); + IIM.TotalNumSGPRs = getTotalNumSGPRs(Features); + IIM.AddressableNumSGPRs = getAddressableNumSGPRs(Features); + IIM.VGPRAllocGranule = getVGPRAllocGranule(Features); + IIM.TotalNumVGPRs = getTotalNumVGPRs(Features); + IIM.AddressableNumVGPRs = getAddressableNumVGPRs(Features); +} + Program::Metadata::Metadata(const std::string &YAML) { yaml::Input Input(YAML); Input >> *this; @@ -411,18 +426,7 @@ std::string llvm::getRuntimeMDYAMLString(const FeatureBitset &Features, Prog.MDVersionSeq.push_back(MDVersion); Prog.MDVersionSeq.push_back(MDRevision); - IsaInfo::Metadata &IIM = Prog.IsaInfo; - IIM.WavefrontSize = AMDGPU::IsaInfo::getWavefrontSize(Features); - IIM.LocalMemorySize = AMDGPU::IsaInfo::getLocalMemorySize(Features); - IIM.EUsPerCU = AMDGPU::IsaInfo::getEUsPerCU(Features); - IIM.MaxWavesPerEU = AMDGPU::IsaInfo::getMaxWavesPerEU(Features); - IIM.MaxFlatWorkGroupSize = AMDGPU::IsaInfo::getMaxFlatWorkGroupSize(Features); - IIM.SGPRAllocGranule = AMDGPU::IsaInfo::getSGPRAllocGranule(Features); - IIM.TotalNumSGPRs = AMDGPU::IsaInfo::getTotalNumSGPRs(Features); - IIM.AddressableNumSGPRs = AMDGPU::IsaInfo::getAddressableNumSGPRs(Features); - IIM.VGPRAllocGranule = AMDGPU::IsaInfo::getVGPRAllocGranule(Features); - IIM.TotalNumVGPRs = AMDGPU::IsaInfo::getTotalNumVGPRs(Features); - IIM.AddressableNumVGPRs = AMDGPU::IsaInfo::getAddressableNumVGPRs(Features); + getIsaInfo(Features, Prog.IsaInfo); // Set PrintfInfo. if (auto MD = M.getNamedMetadata("llvm.printf.fmts")) { @@ -451,3 +455,16 @@ std::string llvm::getRuntimeMDYAMLString(const FeatureBitset &Features, return YAML; } + +ErrorOr<std::string> llvm::getRuntimeMDYAMLString(const FeatureBitset &Features, + StringRef YAML) { + Program::Metadata Prog; + yaml::Input Input(YAML); + Input >> Prog; + + getIsaInfo(Features, Prog.IsaInfo); + + if (Input.error()) + return Input.error(); + return Prog.toYAML(); +} diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.h index 8a73b3d6426..2c1acdca797 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.h +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.h @@ -14,15 +14,20 @@ #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPURUNTIMEMD_H #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPURUNTIMEMD_H +#include "llvm/Support/ErrorOr.h" #include <string> namespace llvm { class FeatureBitset; class Module; -// Get runtime metadata as YAML string. +/// \returns Runtime metadata as YAML string. std::string getRuntimeMDYAMLString(const FeatureBitset &Features, const Module &M); +/// \returns \p YAML if \p YAML is valid runtime metadata, error otherwise. +ErrorOr<std::string> getRuntimeMDYAMLString(const FeatureBitset &Features, + StringRef YAML); + } #endif diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp index 5935c6a49f0..fc07225eebe 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp @@ -100,10 +100,17 @@ void AMDGPUTargetAsmStreamer::EmitRuntimeMetadata(const FeatureBitset &Features, OS << "\n\t.end_amdgpu_runtime_metadata\n"; } -void AMDGPUTargetAsmStreamer::EmitRuntimeMetadata(StringRef Metadata) { +bool AMDGPUTargetAsmStreamer::EmitRuntimeMetadata(const FeatureBitset &Features, + StringRef Metadata) { + auto VerifiedMetadata = getRuntimeMDYAMLString(Features, Metadata); + if (!VerifiedMetadata) + return true; + OS << "\t.amdgpu_runtime_metadata"; - OS << Metadata; + OS << VerifiedMetadata.get(); OS << "\t.end_amdgpu_runtime_metadata\n"; + + return false; } //===----------------------------------------------------------------------===// @@ -216,7 +223,12 @@ void AMDGPUTargetELFStreamer::EmitAMDGPUHsaProgramScopeGlobal( Symbol->setBinding(ELF::STB_GLOBAL); } -void AMDGPUTargetELFStreamer::EmitRuntimeMetadata(StringRef Metadata) { +bool AMDGPUTargetELFStreamer::EmitRuntimeMetadata(const FeatureBitset &Features, + StringRef Metadata) { + auto VerifiedMetadata = getRuntimeMDYAMLString(Features, Metadata); + if (!VerifiedMetadata) + return true; + // Create two labels to mark the beginning and end of the desc field // and a MCExpr to calculate the size of the desc field. auto &Context = getContext(); @@ -231,13 +243,15 @@ void AMDGPUTargetELFStreamer::EmitRuntimeMetadata(StringRef Metadata) { PT_NOTE::NT_AMDGPU_HSA_RUNTIME_METADATA, [&](MCELFStreamer &OS) { OS.EmitLabel(DescBegin); - OS.EmitBytes(Metadata); + OS.EmitBytes(VerifiedMetadata.get()); OS.EmitLabel(DescEnd); } ); + + return false; } void AMDGPUTargetELFStreamer::EmitRuntimeMetadata(const FeatureBitset &Features, const Module &M) { - EmitRuntimeMetadata(getRuntimeMDYAMLString(Features, M)); + EmitRuntimeMetadata(Features, getRuntimeMDYAMLString(Features, M)); } diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h index 8504d1a18cb..20d7bc113cf 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h @@ -50,7 +50,9 @@ public: virtual void EmitRuntimeMetadata(const FeatureBitset &Features, const Module &M) = 0; - virtual void EmitRuntimeMetadata(StringRef Metadata) = 0; + /// \returns False on success, true on failure. + virtual bool EmitRuntimeMetadata(const FeatureBitset &Features, + StringRef Metadata) = 0; }; class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer { @@ -75,7 +77,9 @@ public: void EmitRuntimeMetadata(const FeatureBitset &Features, const Module &M) override; - void EmitRuntimeMetadata(StringRef Metadata) override; + /// \returns False on success, true on failure. + bool EmitRuntimeMetadata(const FeatureBitset &Features, + StringRef Metadata) override; }; class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer { @@ -107,7 +111,9 @@ public: void EmitRuntimeMetadata(const FeatureBitset &Features, const Module &M) override; - void EmitRuntimeMetadata(StringRef Metadata) override; + /// \returns False on success, true on failure. + bool EmitRuntimeMetadata(const FeatureBitset &Features, + StringRef Metadata) override; }; } |

