]> granicus.if.org Git - llvm/commitdiff
AMDGPU: Improve note directive verification in assembler
authorKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Sat, 14 Oct 2017 16:15:28 +0000 (16:15 +0000)
committerKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Sat, 14 Oct 2017 16:15:28 +0000 (16:15 +0000)
  - Do not allow amd_amdgpu_isa directives on non-amdgcn architectures
  - Do not allow amd_amdgpu_hsa_metadata on non-amdhsa OSes
  - Do not allow amd_amdgpu_pal_metadata on non-amdpal OSes

Differential Revision: https://reviews.llvm.org/D38750

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315812 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
test/MC/AMDGPU/elf-notes-verify-amdgcn.s [new file with mode: 0644]
test/MC/AMDGPU/elf-notes-verify-r600.s [new file with mode: 0644]

index 7f8c28e9c243a19436e6e47b689ff0a7b4ec1957..806aa420c50fa8fa95e0c73552d1c2aaad8619c3 100644 (file)
@@ -2454,6 +2454,12 @@ bool AMDGPUAsmParser::ParseDirectiveAMDGPUHsaKernel() {
 }
 
 bool AMDGPUAsmParser::ParseDirectiveISAVersion() {
+  if (getSTI().getTargetTriple().getArch() != Triple::amdgcn) {
+    return Error(getParser().getTok().getLoc(),
+                 ".amd_amdgpu_isa directive is not available on non-amdgcn "
+                 "architectures");
+  }
+
   auto ISAVersionStringFromASM = getLexer().getTok().getStringContents();
 
   std::string ISAVersionStringFromSTI;
@@ -2473,6 +2479,12 @@ bool AMDGPUAsmParser::ParseDirectiveISAVersion() {
 }
 
 bool AMDGPUAsmParser::ParseDirectiveHSAMetadata() {
+  if (getSTI().getTargetTriple().getOS() != Triple::AMDHSA) {
+    return Error(getParser().getTok().getLoc(),
+                 (Twine(HSAMD::AssemblerDirectiveBegin) + Twine(" directive is "
+                 "not available on non-amdhsa OSes")).str());
+  }
+
   std::string HSAMetadataString;
   raw_string_ostream YamlStream(HSAMetadataString);
 
@@ -2504,7 +2516,7 @@ bool AMDGPUAsmParser::ParseDirectiveHSAMetadata() {
 
   if (getLexer().is(AsmToken::Eof) && !FoundEnd) {
     return TokError(Twine("expected directive ") +
-                    Twine(HSAMD::AssemblerDirectiveEnd) + Twine("not found"));
+                    Twine(HSAMD::AssemblerDirectiveEnd) + Twine(" not found"));
   }
 
   YamlStream.flush();
@@ -2516,6 +2528,12 @@ bool AMDGPUAsmParser::ParseDirectiveHSAMetadata() {
 }
 
 bool AMDGPUAsmParser::ParseDirectivePALMetadata() {
+  if (getSTI().getTargetTriple().getOS() != Triple::AMDPAL) {
+    return Error(getParser().getTok().getLoc(),
+                 (Twine(PALMD::AssemblerDirective) + Twine(" directive is "
+                 "not available on non-amdpal OSes")).str());
+  }
+
   PALMD::Metadata PALMetadata;
   for (;;) {
     uint32_t Value;
diff --git a/test/MC/AMDGPU/elf-notes-verify-amdgcn.s b/test/MC/AMDGPU/elf-notes-verify-amdgcn.s
new file mode 100644 (file)
index 0000000..73157ef
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: not llvm-mc -arch amdgcn %s 2>&1 | FileCheck --check-prefix=GCN %s
+
+// GCN: error: .amd_amdgpu_hsa_metadata directive is not available on non-amdhsa OSes
+.amd_amdgpu_hsa_metadata
+
+// GCN: error: .amd_amdgpu_pal_metadata directive is not available on non-amdpal OSes
+.amd_amdgpu_pal_metadata
diff --git a/test/MC/AMDGPU/elf-notes-verify-r600.s b/test/MC/AMDGPU/elf-notes-verify-r600.s
new file mode 100644 (file)
index 0000000..d614409
--- /dev/null
@@ -0,0 +1,10 @@
+// RUN: not llvm-mc -arch r600 %s 2>&1 | FileCheck --check-prefix=R600 %s
+
+// R600: error: .amd_amdgpu_isa directive is not available on non-amdgcn architectures
+.amd_amdgpu_isa "r600"
+
+// R600: error: .amd_amdgpu_hsa_metadata directive is not available on non-amdhsa OSes
+.amd_amdgpu_hsa_metadata
+
+// R600: error: .amd_amdgpu_pal_metadata directive is not available on non-amdpal OSes
+.amd_amdgpu_pal_metadata