[llvm] r286502 - AMDGPU: Emit runtime metadata as a note element in .note section
Yaxun Liu via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 10 13:18:50 PST 2016
Author: yaxunl
Date: Thu Nov 10 15:18:49 2016
New Revision: 286502
URL: http://llvm.org/viewvc/llvm-project?rev=286502&view=rev
Log:
AMDGPU: Emit runtime metadata as a note element in .note section
Currently runtime metadata is emitted as an ELF section with name .AMDGPU.runtime_metadata.
However there is a standard way to convey vendor specific information about how to run an ELF binary, which is called vendor-specific note element (http://www.netbsd.org/docs/kernel/elf-notes.html).
This patch lets AMDGPU backend emits runtime metadata as a note element in .note section.
Differential Revision: https://reviews.llvm.org/D25781
Added:
llvm/trunk/lib/Target/AMDGPU/AMDGPUPTNote.h
Modified:
llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
llvm/trunk/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h
llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata1.ll
llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata2.ll
llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata3.ll
llvm/trunk/test/CodeGen/AMDGPU/runtime-metadata.ll
Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp Thu Nov 10 15:18:49 2016
@@ -39,9 +39,7 @@
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
-#include "AMDGPURuntimeMetadata.h"
-using namespace ::AMDGPU;
using namespace llvm;
// TODO: This should get the default rounding mode from the kernel. We just set
@@ -119,7 +117,9 @@ void AMDGPUAsmPrinter::EmitStartOfAsmFil
AMDGPU::IsaVersion ISA = AMDGPU::getIsaVersion(STI->getFeatureBits());
TS->EmitDirectiveHSACodeObjectISA(ISA.Major, ISA.Minor, ISA.Stepping,
"AMD", "AMDGPU");
- emitStartOfRuntimeMetadata(M);
+
+ // Emit runtime metadata.
+ TS->emitRuntimeMetadataAsNoteElement(M);
}
bool AMDGPUAsmPrinter::isBlockOnlyReachableByFallthrough(
@@ -279,8 +279,6 @@ bool AMDGPUAsmPrinter::runOnMachineFunct
}
}
- emitRuntimeMetadata(*MF.getFunction());
-
return false;
}
@@ -800,307 +798,3 @@ bool AMDGPUAsmPrinter::PrintAsmOperand(c
return false;
}
-// Emit a key and an integer value for runtime metadata.
-static void emitRuntimeMDIntValue(MCStreamer &Streamer,
- RuntimeMD::Key K, uint64_t V,
- unsigned Size) {
- Streamer.EmitIntValue(K, 1);
- Streamer.EmitIntValue(V, Size);
-}
-
-// Emit a key and a string value for runtime metadata.
-static void emitRuntimeMDStringValue(MCStreamer &Streamer,
- RuntimeMD::Key K, StringRef S) {
- Streamer.EmitIntValue(K, 1);
- Streamer.EmitIntValue(S.size(), 4);
- Streamer.EmitBytes(S);
-}
-
-// Emit a key and three integer values for runtime metadata.
-// The three integer values are obtained from MDNode \p Node;
-static void emitRuntimeMDThreeIntValues(MCStreamer &Streamer,
- RuntimeMD::Key K, MDNode *Node,
- unsigned Size) {
- assert(Node->getNumOperands() == 3);
-
- Streamer.EmitIntValue(K, 1);
- for (const MDOperand &Op : Node->operands()) {
- const ConstantInt *CI = mdconst::extract<ConstantInt>(Op);
- Streamer.EmitIntValue(CI->getZExtValue(), Size);
- }
-}
-
-void AMDGPUAsmPrinter::emitStartOfRuntimeMetadata(const Module &M) {
- OutStreamer->SwitchSection(getObjFileLowering().getContext()
- .getELFSection(RuntimeMD::SectionName, ELF::SHT_PROGBITS, 0));
-
- emitRuntimeMDIntValue(*OutStreamer, RuntimeMD::KeyMDVersion,
- RuntimeMD::MDVersion << 8 | RuntimeMD::MDRevision, 2);
- if (auto MD = M.getNamedMetadata("opencl.ocl.version")) {
- if (MD->getNumOperands() != 0) {
- auto Node = MD->getOperand(0);
- if (Node->getNumOperands() > 1) {
- emitRuntimeMDIntValue(*OutStreamer, RuntimeMD::KeyLanguage,
- RuntimeMD::OpenCL_C, 1);
- uint16_t Major = mdconst::extract<ConstantInt>(Node->getOperand(0))
- ->getZExtValue();
- uint16_t Minor = mdconst::extract<ConstantInt>(Node->getOperand(1))
- ->getZExtValue();
- emitRuntimeMDIntValue(*OutStreamer, RuntimeMD::KeyLanguageVersion,
- Major * 100 + Minor * 10, 2);
- }
- }
- }
-
- if (auto MD = M.getNamedMetadata("llvm.printf.fmts")) {
- for (unsigned I = 0; I < MD->getNumOperands(); ++I) {
- auto Node = MD->getOperand(I);
- if (Node->getNumOperands() > 0)
- emitRuntimeMDStringValue(*OutStreamer, RuntimeMD::KeyPrintfInfo,
- cast<MDString>(Node->getOperand(0))->getString());
- }
- }
-}
-
-static std::string getOCLTypeName(Type *Ty, bool Signed) {
- switch (Ty->getTypeID()) {
- case Type::HalfTyID:
- return "half";
- case Type::FloatTyID:
- return "float";
- case Type::DoubleTyID:
- return "double";
- case Type::IntegerTyID: {
- if (!Signed)
- return (Twine('u') + getOCLTypeName(Ty, true)).str();
- unsigned BW = Ty->getIntegerBitWidth();
- switch (BW) {
- case 8:
- return "char";
- case 16:
- return "short";
- case 32:
- return "int";
- case 64:
- return "long";
- default:
- return (Twine('i') + Twine(BW)).str();
- }
- }
- case Type::VectorTyID: {
- VectorType *VecTy = cast<VectorType>(Ty);
- Type *EleTy = VecTy->getElementType();
- unsigned Size = VecTy->getVectorNumElements();
- return (Twine(getOCLTypeName(EleTy, Signed)) + Twine(Size)).str();
- }
- default:
- return "unknown";
- }
-}
-
-static RuntimeMD::KernelArg::ValueType getRuntimeMDValueType(
- Type *Ty, StringRef TypeName) {
- switch (Ty->getTypeID()) {
- case Type::HalfTyID:
- return RuntimeMD::KernelArg::F16;
- case Type::FloatTyID:
- return RuntimeMD::KernelArg::F32;
- case Type::DoubleTyID:
- return RuntimeMD::KernelArg::F64;
- case Type::IntegerTyID: {
- bool Signed = !TypeName.startswith("u");
- switch (Ty->getIntegerBitWidth()) {
- case 8:
- return Signed ? RuntimeMD::KernelArg::I8 : RuntimeMD::KernelArg::U8;
- case 16:
- return Signed ? RuntimeMD::KernelArg::I16 : RuntimeMD::KernelArg::U16;
- case 32:
- return Signed ? RuntimeMD::KernelArg::I32 : RuntimeMD::KernelArg::U32;
- case 64:
- return Signed ? RuntimeMD::KernelArg::I64 : RuntimeMD::KernelArg::U64;
- default:
- // Runtime does not recognize other integer types. Report as struct type.
- return RuntimeMD::KernelArg::Struct;
- }
- }
- case Type::VectorTyID:
- return getRuntimeMDValueType(Ty->getVectorElementType(), TypeName);
- case Type::PointerTyID:
- return getRuntimeMDValueType(Ty->getPointerElementType(), TypeName);
- default:
- return RuntimeMD::KernelArg::Struct;
- }
-}
-
-static RuntimeMD::KernelArg::AddressSpaceQualifer getRuntimeAddrSpace(
- AMDGPUAS::AddressSpaces A) {
- switch (A) {
- case AMDGPUAS::GLOBAL_ADDRESS:
- return RuntimeMD::KernelArg::Global;
- case AMDGPUAS::CONSTANT_ADDRESS:
- return RuntimeMD::KernelArg::Constant;
- case AMDGPUAS::LOCAL_ADDRESS:
- return RuntimeMD::KernelArg::Local;
- case AMDGPUAS::FLAT_ADDRESS:
- return RuntimeMD::KernelArg::Generic;
- case AMDGPUAS::REGION_ADDRESS:
- return RuntimeMD::KernelArg::Region;
- default:
- return RuntimeMD::KernelArg::Private;
- }
-}
-
-static void emitRuntimeMetadataForKernelArg(const DataLayout &DL,
- MCStreamer &OutStreamer, Type *T,
- RuntimeMD::KernelArg::Kind Kind,
- StringRef BaseTypeName = "", StringRef TypeName = "",
- StringRef ArgName = "", StringRef TypeQual = "", StringRef AccQual = "") {
- // Emit KeyArgBegin.
- OutStreamer.EmitIntValue(RuntimeMD::KeyArgBegin, 1);
-
- // Emit KeyArgSize and KeyArgAlign.
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgSize,
- DL.getTypeAllocSize(T), 4);
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgAlign,
- DL.getABITypeAlignment(T), 4);
- if (auto PT = dyn_cast<PointerType>(T)) {
- auto ET = PT->getElementType();
- if (PT->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS && ET->isSized())
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgPointeeAlign,
- DL.getABITypeAlignment(ET), 4);
- }
-
- // Emit KeyArgTypeName.
- if (!TypeName.empty())
- emitRuntimeMDStringValue(OutStreamer, RuntimeMD::KeyArgTypeName, TypeName);
-
- // Emit KeyArgName.
- if (!ArgName.empty())
- emitRuntimeMDStringValue(OutStreamer, RuntimeMD::KeyArgName, ArgName);
-
- // Emit KeyArgIsVolatile, KeyArgIsRestrict, KeyArgIsConst and KeyArgIsPipe.
- SmallVector<StringRef, 1> SplitQ;
- TypeQual.split(SplitQ, " ", -1, false /* Drop empty entry */);
-
- for (StringRef KeyName : SplitQ) {
- auto Key = StringSwitch<RuntimeMD::Key>(KeyName)
- .Case("volatile", RuntimeMD::KeyArgIsVolatile)
- .Case("restrict", RuntimeMD::KeyArgIsRestrict)
- .Case("const", RuntimeMD::KeyArgIsConst)
- .Case("pipe", RuntimeMD::KeyArgIsPipe)
- .Default(RuntimeMD::KeyNull);
- OutStreamer.EmitIntValue(Key, 1);
- }
-
- // Emit KeyArgKind.
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgKind, Kind, 1);
-
- // Emit KeyArgValueType.
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgValueType,
- getRuntimeMDValueType(T, BaseTypeName), 2);
-
- // Emit KeyArgAccQual.
- if (!AccQual.empty()) {
- auto AQ = StringSwitch<RuntimeMD::KernelArg::AccessQualifer>(AccQual)
- .Case("read_only", RuntimeMD::KernelArg::ReadOnly)
- .Case("write_only", RuntimeMD::KernelArg::WriteOnly)
- .Case("read_write", RuntimeMD::KernelArg::ReadWrite)
- .Default(RuntimeMD::KernelArg::None);
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgAccQual, AQ, 1);
- }
-
- // Emit KeyArgAddrQual.
- if (auto *PT = dyn_cast<PointerType>(T))
- emitRuntimeMDIntValue(OutStreamer, RuntimeMD::KeyArgAddrQual,
- getRuntimeAddrSpace(static_cast<AMDGPUAS::AddressSpaces>(
- PT->getAddressSpace())), 1);
-
- // Emit KeyArgEnd
- OutStreamer.EmitIntValue(RuntimeMD::KeyArgEnd, 1);
-}
-
-void AMDGPUAsmPrinter::emitRuntimeMetadata(const Function &F) {
- if (!F.getMetadata("kernel_arg_type"))
- return;
-
- MCContext &Context = getObjFileLowering().getContext();
- OutStreamer->SwitchSection(
- Context.getELFSection(RuntimeMD::SectionName, ELF::SHT_PROGBITS, 0));
- OutStreamer->EmitIntValue(RuntimeMD::KeyKernelBegin, 1);
- emitRuntimeMDStringValue(*OutStreamer, RuntimeMD::KeyKernelName, F.getName());
-
- const DataLayout &DL = F.getParent()->getDataLayout();
- for (auto &Arg : F.args()) {
- unsigned I = Arg.getArgNo();
- Type *T = Arg.getType();
- auto TypeName = dyn_cast<MDString>(F.getMetadata(
- "kernel_arg_type")->getOperand(I))->getString();
- auto BaseTypeName = cast<MDString>(F.getMetadata(
- "kernel_arg_base_type")->getOperand(I))->getString();
- StringRef ArgName;
- if (auto ArgNameMD = F.getMetadata("kernel_arg_name"))
- ArgName = cast<MDString>(ArgNameMD->getOperand(I))->getString();
- auto TypeQual = cast<MDString>(F.getMetadata(
- "kernel_arg_type_qual")->getOperand(I))->getString();
- auto AccQual = cast<MDString>(F.getMetadata(
- "kernel_arg_access_qual")->getOperand(I))->getString();
- RuntimeMD::KernelArg::Kind Kind;
- if (TypeQual.find("pipe") != StringRef::npos)
- Kind = RuntimeMD::KernelArg::Pipe;
- else Kind = StringSwitch<RuntimeMD::KernelArg::Kind>(BaseTypeName)
- .Case("sampler_t", RuntimeMD::KernelArg::Sampler)
- .Case("queue_t", RuntimeMD::KernelArg::Queue)
- .Cases("image1d_t", "image1d_array_t", "image1d_buffer_t",
- "image2d_t" , "image2d_array_t", RuntimeMD::KernelArg::Image)
- .Cases("image2d_depth_t", "image2d_array_depth_t",
- "image2d_msaa_t", "image2d_array_msaa_t",
- "image2d_msaa_depth_t", RuntimeMD::KernelArg::Image)
- .Cases("image2d_array_msaa_depth_t", "image3d_t",
- RuntimeMD::KernelArg::Image)
- .Default(isa<PointerType>(T) ?
- (T->getPointerAddressSpace() == AMDGPUAS::LOCAL_ADDRESS ?
- RuntimeMD::KernelArg::DynamicSharedPointer :
- RuntimeMD::KernelArg::GlobalBuffer) :
- RuntimeMD::KernelArg::ByValue);
- emitRuntimeMetadataForKernelArg(DL, *OutStreamer, T,
- Kind, BaseTypeName, TypeName, ArgName, TypeQual, AccQual);
- }
-
- // Emit hidden kernel arguments for OpenCL kernels.
- if (F.getParent()->getNamedMetadata("opencl.ocl.version")) {
- auto Int64T = Type::getInt64Ty(F.getContext());
- emitRuntimeMetadataForKernelArg(DL, *OutStreamer, Int64T,
- RuntimeMD::KernelArg::HiddenGlobalOffsetX);
- emitRuntimeMetadataForKernelArg(DL, *OutStreamer, Int64T,
- RuntimeMD::KernelArg::HiddenGlobalOffsetY);
- emitRuntimeMetadataForKernelArg(DL, *OutStreamer, Int64T,
- RuntimeMD::KernelArg::HiddenGlobalOffsetZ);
- if (F.getParent()->getNamedMetadata("llvm.printf.fmts")) {
- auto Int8PtrT = Type::getInt8PtrTy(F.getContext(),
- RuntimeMD::KernelArg::Global);
- emitRuntimeMetadataForKernelArg(DL, *OutStreamer, Int8PtrT,
- RuntimeMD::KernelArg::HiddenPrintfBuffer);
- }
- }
-
- // Emit KeyReqdWorkGroupSize, KeyWorkGroupSizeHint, and KeyVecTypeHint.
- if (auto RWGS = F.getMetadata("reqd_work_group_size")) {
- emitRuntimeMDThreeIntValues(*OutStreamer, RuntimeMD::KeyReqdWorkGroupSize,
- RWGS, 4);
- }
-
- if (auto WGSH = F.getMetadata("work_group_size_hint")) {
- emitRuntimeMDThreeIntValues(*OutStreamer, RuntimeMD::KeyWorkGroupSizeHint,
- WGSH, 4);
- }
-
- if (auto VTH = F.getMetadata("vec_type_hint")) {
- auto TypeName = getOCLTypeName(cast<ValueAsMetadata>(
- VTH->getOperand(0))->getType(), mdconst::extract<ConstantInt>(
- VTH->getOperand(1))->getZExtValue());
- emitRuntimeMDStringValue(*OutStreamer, RuntimeMD::KeyVecTypeHint, TypeName);
- }
-
- // Emit KeyKernelEnd
- OutStreamer->EmitIntValue(RuntimeMD::KeyKernelEnd, 1);
-}
Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.h?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.h (original)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUAsmPrinter.h Thu Nov 10 15:18:49 2016
@@ -150,10 +150,6 @@ public:
unsigned AsmVariant, const char *ExtraCode,
raw_ostream &O) override;
- void emitStartOfRuntimeMetadata(const Module &M);
-
- void emitRuntimeMetadata(const Function &F);
-
protected:
std::vector<std::string> DisasmLines, HexLines;
size_t DisasmLineMaxLen;
Added: llvm/trunk/lib/Target/AMDGPU/AMDGPUPTNote.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUPTNote.h?rev=286502&view=auto
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUPTNote.h (added)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUPTNote.h Thu Nov 10 15:18:49 2016
@@ -0,0 +1,42 @@
+//===-- AMDGPUNoteType.h - AMDGPU ELF PT_NOTE section info-------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file
+///
+/// Enums and constants for AMDGPU PT_NOTE sections.
+///
+//
+//===----------------------------------------------------------------------===//
+//
+#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUPTNOTE_H
+#define LLVM_LIB_TARGET_AMDGPU_AMDGPUPTNOTE_H
+
+namespace AMDGPU {
+
+namespace PT_NOTE {
+
+const char SectionName[] = ".note";
+
+const char NoteName[] = "AMD";
+
+enum NoteType{
+ NT_AMDGPU_HSA_CODE_OBJECT_VERSION = 1,
+ NT_AMDGPU_HSA_HSAIL = 2,
+ NT_AMDGPU_HSA_ISA = 3,
+ NT_AMDGPU_HSA_PRODUCER = 4,
+ NT_AMDGPU_HSA_PRODUCER_OPTIONS = 5,
+ NT_AMDGPU_HSA_EXTENSION = 6,
+ NT_AMDGPU_HSA_RUNTIME_METADATA = 7,
+ NT_AMDGPU_HSA_HLDEBUG_DEBUG = 101,
+ NT_AMDGPU_HSA_HLDEBUG_TARGET = 102
+};
+}
+}
+
+#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUNOTETYPE_H
Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h (original)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h Thu Nov 10 15:18:49 2016
@@ -13,11 +13,11 @@
///
/// Runtime requests certain information (metadata) about kernels to be able
/// to execute the kernels and answer the queries about the kernels.
-/// The metadata is represented as a byte stream in an ELF section of a
-/// binary (code object). The byte stream consists of key-value pairs.
-/// Each key is an 8 bit unsigned integer. Each value can be an integer,
-/// a string, or a stream of key-value pairs. There are 3 levels of key-value
-/// pair streams. At the beginning of the ELF section is the top level
+/// The metadata is represented as a note element in the .note ELF section of a
+/// binary (code object). The desc field of the note element consists of
+/// key-value pairs. Each key is an 8 bit unsigned integer. Each value can be
+/// an integer, a string, or a stream of key-value pairs. There are 3 levels of
+/// key-value pair streams. At the beginning of the ELF section is the top level
/// key-value pair stream. A kernel-level key-value pair stream starts after
/// encountering KeyKernelBegin and ends immediately before encountering
/// KeyKernelEnd. A kernel-argument-level key-value pair stream starts
@@ -47,9 +47,6 @@ namespace RuntimeMD {
const unsigned char MDVersion = 1;
const unsigned char MDRevision = 0;
- // ELF section name containing runtime metadata
- const char SectionName[] = ".AMDGPU.runtime_metadata";
-
// Enumeration values of keys in runtime metadata.
enum Key {
KeyNull = 0, // Place holder. Ignored when encountered
Modified: llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp Thu Nov 10 15:18:49 2016
@@ -11,11 +11,16 @@
//
//===----------------------------------------------------------------------===//
+#include "AMDGPU.h"
#include "AMDGPUTargetStreamer.h"
#include "SIDefines.h"
#include "Utils/AMDGPUBaseInfo.h"
#include "Utils/AMDKernelCodeTUtils.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/Module.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCObjectFileInfo.h"
@@ -23,10 +28,15 @@
#include "llvm/Support/ELF.h"
#include "llvm/Support/FormattedStream.h"
+namespace llvm {
+#include "AMDGPUPTNote.h"
+}
+
using namespace llvm;
+using namespace llvm::AMDGPU;
AMDGPUTargetStreamer::AMDGPUTargetStreamer(MCStreamer &S)
- : MCTargetStreamer(S) { }
+ : MCTargetStreamer(S) {}
//===----------------------------------------------------------------------===//
// AMDGPUTargetAsmStreamer
@@ -86,10 +96,8 @@ void AMDGPUTargetAsmStreamer::EmitAMDGPU
// AMDGPUTargetELFStreamer
//===----------------------------------------------------------------------===//
-const char *AMDGPUTargetELFStreamer::NoteName = "AMD";
-
AMDGPUTargetELFStreamer::AMDGPUTargetELFStreamer(MCStreamer &S)
- : AMDGPUTargetStreamer(S), Streamer(S) { }
+ : AMDGPUTargetStreamer(S), Streamer(S) {}
MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
return static_cast<MCELFStreamer &>(Streamer);
@@ -100,16 +108,18 @@ AMDGPUTargetELFStreamer::EmitDirectiveHS
uint32_t Minor) {
MCStreamer &OS = getStreamer();
MCSectionELF *Note =
- OS.getContext().getELFSection(".note", ELF::SHT_NOTE, ELF::SHF_ALLOC);
+ OS.getContext().getELFSection(PT_NOTE::NoteName, ELF::SHT_NOTE,
+ ELF::SHF_ALLOC);
+ auto NameSZ = sizeof(PT_NOTE::NoteName);
OS.PushSection();
OS.SwitchSection(Note);
- OS.EmitIntValue(strlen(NoteName) + 1, 4); // namesz
- OS.EmitIntValue(8, 4); // descz
- OS.EmitIntValue(NT_AMDGPU_HSA_CODE_OBJECT_VERSION, 4); // type
- OS.EmitBytes(StringRef(NoteName, strlen(NoteName) + 1)); // name
+ OS.EmitIntValue(NameSZ, 4); // namesz
+ OS.EmitIntValue(8, 4); // descz
+ OS.EmitIntValue(PT_NOTE::NT_AMDGPU_HSA_CODE_OBJECT_VERSION, 4); // type
+ OS.EmitBytes(StringRef(PT_NOTE::NoteName, NameSZ)); // name
OS.EmitValueToAlignment(4);
- OS.EmitIntValue(Major, 4); // desc
+ OS.EmitIntValue(Major, 4); // desc
OS.EmitIntValue(Minor, 4);
OS.EmitValueToAlignment(4);
OS.PopSection();
@@ -123,7 +133,8 @@ AMDGPUTargetELFStreamer::EmitDirectiveHS
StringRef ArchName) {
MCStreamer &OS = getStreamer();
MCSectionELF *Note =
- OS.getContext().getELFSection(".note", ELF::SHT_NOTE, ELF::SHF_ALLOC);
+ OS.getContext().getELFSection(PT_NOTE::NoteName, ELF::SHT_NOTE,
+ ELF::SHF_ALLOC);
uint16_t VendorNameSize = VendorName.size() + 1;
uint16_t ArchNameSize = ArchName.size() + 1;
@@ -133,10 +144,11 @@ AMDGPUTargetELFStreamer::EmitDirectiveHS
OS.PushSection();
OS.SwitchSection(Note);
- OS.EmitIntValue(strlen(NoteName) + 1, 4); // namesz
+ auto NameSZ = sizeof(PT_NOTE::NoteName);
+ OS.EmitIntValue(NameSZ, 4); // namesz
OS.EmitIntValue(DescSZ, 4); // descsz
- OS.EmitIntValue(NT_AMDGPU_HSA_ISA, 4); // type
- OS.EmitBytes(StringRef(NoteName, strlen(NoteName) + 1)); // name
+ OS.EmitIntValue(PT_NOTE::NT_AMDGPU_HSA_ISA, 4); // type
+ OS.EmitBytes(StringRef(PT_NOTE::NoteName, NameSZ)); // name
OS.EmitValueToAlignment(4);
OS.EmitIntValue(VendorNameSize, 2); // desc
OS.EmitIntValue(ArchNameSize, 2);
@@ -184,3 +196,341 @@ void AMDGPUTargetELFStreamer::EmitAMDGPU
Symbol->setType(ELF::STT_OBJECT);
Symbol->setBinding(ELF::STB_GLOBAL);
}
+
+void AMDGPUTargetStreamer::emitRuntimeMDIntValue(RuntimeMD::Key K, uint64_t V,
+ unsigned Size) {
+ auto &S = getStreamer();
+ S.EmitIntValue(K, 1);
+ S.EmitIntValue(V, Size);
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMDStringValue(RuntimeMD::Key K,
+ StringRef R) {
+ auto &S = getStreamer();
+ S.EmitIntValue(K, 1);
+ S.EmitIntValue(R.size(), 4);
+ S.EmitBytes(R);
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMDThreeIntValues(RuntimeMD::Key K,
+ MDNode *Node,
+ unsigned Size) {
+ assert(Node->getNumOperands() == 3);
+
+ auto &S = getStreamer();
+ S.EmitIntValue(K, 1);
+ for (const MDOperand &Op : Node->operands()) {
+ const ConstantInt *CI = mdconst::extract<ConstantInt>(Op);
+ S.EmitIntValue(CI->getZExtValue(), Size);
+ }
+}
+
+void AMDGPUTargetStreamer::emitStartOfRuntimeMetadata(const Module &M) {
+ emitRuntimeMDIntValue(RuntimeMD::KeyMDVersion,
+ RuntimeMD::MDVersion << 8 | RuntimeMD::MDRevision, 2);
+ if (auto MD = M.getNamedMetadata("opencl.ocl.version")) {
+ if (MD->getNumOperands() != 0) {
+ auto Node = MD->getOperand(0);
+ if (Node->getNumOperands() > 1) {
+ emitRuntimeMDIntValue(RuntimeMD::KeyLanguage,
+ RuntimeMD::OpenCL_C, 1);
+ uint16_t Major = mdconst::extract<ConstantInt>(Node->getOperand(0))
+ ->getZExtValue();
+ uint16_t Minor = mdconst::extract<ConstantInt>(Node->getOperand(1))
+ ->getZExtValue();
+ emitRuntimeMDIntValue(RuntimeMD::KeyLanguageVersion,
+ Major * 100 + Minor * 10, 2);
+ }
+ }
+ }
+
+ if (auto MD = M.getNamedMetadata("llvm.printf.fmts")) {
+ for (unsigned I = 0; I < MD->getNumOperands(); ++I) {
+ auto Node = MD->getOperand(I);
+ if (Node->getNumOperands() > 0)
+ emitRuntimeMDStringValue(RuntimeMD::KeyPrintfInfo,
+ cast<MDString>(Node->getOperand(0))->getString());
+ }
+ }
+}
+
+static std::string getOCLTypeName(Type *Ty, bool Signed) {
+ switch (Ty->getTypeID()) {
+ case Type::HalfTyID:
+ return "half";
+ case Type::FloatTyID:
+ return "float";
+ case Type::DoubleTyID:
+ return "double";
+ case Type::IntegerTyID: {
+ if (!Signed)
+ return (Twine('u') + getOCLTypeName(Ty, true)).str();
+ unsigned BW = Ty->getIntegerBitWidth();
+ switch (BW) {
+ case 8:
+ return "char";
+ case 16:
+ return "short";
+ case 32:
+ return "int";
+ case 64:
+ return "long";
+ default:
+ return (Twine('i') + Twine(BW)).str();
+ }
+ }
+ case Type::VectorTyID: {
+ VectorType *VecTy = cast<VectorType>(Ty);
+ Type *EleTy = VecTy->getElementType();
+ unsigned Size = VecTy->getVectorNumElements();
+ return (Twine(getOCLTypeName(EleTy, Signed)) + Twine(Size)).str();
+ }
+ default:
+ return "unknown";
+ }
+}
+
+static RuntimeMD::KernelArg::ValueType getRuntimeMDValueType(
+ Type *Ty, StringRef TypeName) {
+ switch (Ty->getTypeID()) {
+ case Type::HalfTyID:
+ return RuntimeMD::KernelArg::F16;
+ case Type::FloatTyID:
+ return RuntimeMD::KernelArg::F32;
+ case Type::DoubleTyID:
+ return RuntimeMD::KernelArg::F64;
+ case Type::IntegerTyID: {
+ bool Signed = !TypeName.startswith("u");
+ switch (Ty->getIntegerBitWidth()) {
+ case 8:
+ return Signed ? RuntimeMD::KernelArg::I8 : RuntimeMD::KernelArg::U8;
+ case 16:
+ return Signed ? RuntimeMD::KernelArg::I16 : RuntimeMD::KernelArg::U16;
+ case 32:
+ return Signed ? RuntimeMD::KernelArg::I32 : RuntimeMD::KernelArg::U32;
+ case 64:
+ return Signed ? RuntimeMD::KernelArg::I64 : RuntimeMD::KernelArg::U64;
+ default:
+ // Runtime does not recognize other integer types. Report as struct type.
+ return RuntimeMD::KernelArg::Struct;
+ }
+ }
+ case Type::VectorTyID:
+ return getRuntimeMDValueType(Ty->getVectorElementType(), TypeName);
+ case Type::PointerTyID:
+ return getRuntimeMDValueType(Ty->getPointerElementType(), TypeName);
+ default:
+ return RuntimeMD::KernelArg::Struct;
+ }
+}
+
+static RuntimeMD::KernelArg::AddressSpaceQualifer getRuntimeAddrSpace(
+ AMDGPUAS::AddressSpaces A) {
+ switch (A) {
+ case AMDGPUAS::GLOBAL_ADDRESS:
+ return RuntimeMD::KernelArg::Global;
+ case AMDGPUAS::CONSTANT_ADDRESS:
+ return RuntimeMD::KernelArg::Constant;
+ case AMDGPUAS::LOCAL_ADDRESS:
+ return RuntimeMD::KernelArg::Local;
+ case AMDGPUAS::FLAT_ADDRESS:
+ return RuntimeMD::KernelArg::Generic;
+ case AMDGPUAS::REGION_ADDRESS:
+ return RuntimeMD::KernelArg::Region;
+ default:
+ return RuntimeMD::KernelArg::Private;
+ }
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMetadataForKernelArg(const DataLayout &DL,
+ Type *T, RuntimeMD::KernelArg::Kind Kind,
+ StringRef BaseTypeName, StringRef TypeName,
+ StringRef ArgName, StringRef TypeQual, StringRef AccQual) {
+ auto &S = getStreamer();
+
+ // Emit KeyArgBegin.
+ S.EmitIntValue(RuntimeMD::KeyArgBegin, 1);
+
+ // Emit KeyArgSize and KeyArgAlign.
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgSize,
+ DL.getTypeAllocSize(T), 4);
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgAlign,
+ DL.getABITypeAlignment(T), 4);
+ if (auto PT = dyn_cast<PointerType>(T)) {
+ auto ET = PT->getElementType();
+ if (PT->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS && ET->isSized())
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgPointeeAlign,
+ DL.getABITypeAlignment(ET), 4);
+ }
+
+ // Emit KeyArgTypeName.
+ if (!TypeName.empty())
+ emitRuntimeMDStringValue(RuntimeMD::KeyArgTypeName, TypeName);
+
+ // Emit KeyArgName.
+ if (!ArgName.empty())
+ emitRuntimeMDStringValue(RuntimeMD::KeyArgName, ArgName);
+
+ // Emit KeyArgIsVolatile, KeyArgIsRestrict, KeyArgIsConst and KeyArgIsPipe.
+ SmallVector<StringRef, 1> SplitQ;
+ TypeQual.split(SplitQ, " ", -1, false /* Drop empty entry */);
+
+ for (StringRef KeyName : SplitQ) {
+ auto Key = StringSwitch<RuntimeMD::Key>(KeyName)
+ .Case("volatile", RuntimeMD::KeyArgIsVolatile)
+ .Case("restrict", RuntimeMD::KeyArgIsRestrict)
+ .Case("const", RuntimeMD::KeyArgIsConst)
+ .Case("pipe", RuntimeMD::KeyArgIsPipe)
+ .Default(RuntimeMD::KeyNull);
+ S.EmitIntValue(Key, 1);
+ }
+
+ // Emit KeyArgKind.
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgKind, Kind, 1);
+
+ // Emit KeyArgValueType.
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgValueType,
+ getRuntimeMDValueType(T, BaseTypeName), 2);
+
+ // Emit KeyArgAccQual.
+ if (!AccQual.empty()) {
+ auto AQ = StringSwitch<RuntimeMD::KernelArg::AccessQualifer>(AccQual)
+ .Case("read_only", RuntimeMD::KernelArg::ReadOnly)
+ .Case("write_only", RuntimeMD::KernelArg::WriteOnly)
+ .Case("read_write", RuntimeMD::KernelArg::ReadWrite)
+ .Default(RuntimeMD::KernelArg::None);
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgAccQual, AQ, 1);
+ }
+
+ // Emit KeyArgAddrQual.
+ if (auto *PT = dyn_cast<PointerType>(T))
+ emitRuntimeMDIntValue(RuntimeMD::KeyArgAddrQual,
+ getRuntimeAddrSpace(static_cast<AMDGPUAS::AddressSpaces>(
+ PT->getAddressSpace())), 1);
+
+ // Emit KeyArgEnd
+ S.EmitIntValue(RuntimeMD::KeyArgEnd, 1);
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMetadata(const Function &F) {
+ if (!F.getMetadata("kernel_arg_type"))
+ return;
+ auto &S = getStreamer();
+ S.EmitIntValue(RuntimeMD::KeyKernelBegin, 1);
+ emitRuntimeMDStringValue(RuntimeMD::KeyKernelName, F.getName());
+
+ const DataLayout &DL = F.getParent()->getDataLayout();
+ for (auto &Arg : F.args()) {
+ unsigned I = Arg.getArgNo();
+ Type *T = Arg.getType();
+ auto TypeName = dyn_cast<MDString>(F.getMetadata(
+ "kernel_arg_type")->getOperand(I))->getString();
+ auto BaseTypeName = cast<MDString>(F.getMetadata(
+ "kernel_arg_base_type")->getOperand(I))->getString();
+ StringRef ArgName;
+ if (auto ArgNameMD = F.getMetadata("kernel_arg_name"))
+ ArgName = cast<MDString>(ArgNameMD->getOperand(I))->getString();
+ auto TypeQual = cast<MDString>(F.getMetadata(
+ "kernel_arg_type_qual")->getOperand(I))->getString();
+ auto AccQual = cast<MDString>(F.getMetadata(
+ "kernel_arg_access_qual")->getOperand(I))->getString();
+ RuntimeMD::KernelArg::Kind Kind;
+ if (TypeQual.find("pipe") != StringRef::npos)
+ Kind = RuntimeMD::KernelArg::Pipe;
+ else Kind = StringSwitch<RuntimeMD::KernelArg::Kind>(BaseTypeName)
+ .Case("sampler_t", RuntimeMD::KernelArg::Sampler)
+ .Case("queue_t", RuntimeMD::KernelArg::Queue)
+ .Cases("image1d_t", "image1d_array_t", "image1d_buffer_t",
+ "image2d_t" , "image2d_array_t", RuntimeMD::KernelArg::Image)
+ .Cases("image2d_depth_t", "image2d_array_depth_t",
+ "image2d_msaa_t", "image2d_array_msaa_t",
+ "image2d_msaa_depth_t", RuntimeMD::KernelArg::Image)
+ .Cases("image2d_array_msaa_depth_t", "image3d_t",
+ RuntimeMD::KernelArg::Image)
+ .Default(isa<PointerType>(T) ?
+ (T->getPointerAddressSpace() == AMDGPUAS::LOCAL_ADDRESS ?
+ RuntimeMD::KernelArg::DynamicSharedPointer :
+ RuntimeMD::KernelArg::GlobalBuffer) :
+ RuntimeMD::KernelArg::ByValue);
+ emitRuntimeMetadataForKernelArg(DL, T,
+ Kind, BaseTypeName, TypeName, ArgName, TypeQual, AccQual);
+ }
+
+ // Emit hidden kernel arguments for OpenCL kernels.
+ if (F.getParent()->getNamedMetadata("opencl.ocl.version")) {
+ auto Int64T = Type::getInt64Ty(F.getContext());
+ emitRuntimeMetadataForKernelArg(DL, Int64T,
+ RuntimeMD::KernelArg::HiddenGlobalOffsetX);
+ emitRuntimeMetadataForKernelArg(DL, Int64T,
+ RuntimeMD::KernelArg::HiddenGlobalOffsetY);
+ emitRuntimeMetadataForKernelArg(DL, Int64T,
+ RuntimeMD::KernelArg::HiddenGlobalOffsetZ);
+ if (F.getParent()->getNamedMetadata("llvm.printf.fmts")) {
+ auto Int8PtrT = Type::getInt8PtrTy(F.getContext(),
+ RuntimeMD::KernelArg::Global);
+ emitRuntimeMetadataForKernelArg(DL, Int8PtrT,
+ RuntimeMD::KernelArg::HiddenPrintfBuffer);
+ }
+ }
+
+ // Emit KeyReqdWorkGroupSize, KeyWorkGroupSizeHint, and KeyVecTypeHint.
+ if (auto RWGS = F.getMetadata("reqd_work_group_size")) {
+ emitRuntimeMDThreeIntValues(RuntimeMD::KeyReqdWorkGroupSize,
+ RWGS, 4);
+ }
+
+ if (auto WGSH = F.getMetadata("work_group_size_hint")) {
+ emitRuntimeMDThreeIntValues(RuntimeMD::KeyWorkGroupSizeHint,
+ WGSH, 4);
+ }
+
+ if (auto VTH = F.getMetadata("vec_type_hint")) {
+ auto TypeName = getOCLTypeName(cast<ValueAsMetadata>(
+ VTH->getOperand(0))->getType(), mdconst::extract<ConstantInt>(
+ VTH->getOperand(1))->getZExtValue());
+ emitRuntimeMDStringValue(RuntimeMD::KeyVecTypeHint, TypeName);
+ }
+
+ // Emit KeyKernelEnd
+ S.EmitIntValue(RuntimeMD::KeyKernelEnd, 1);
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMetadataAsNoteElement(Module &M) {
+ auto &S = getStreamer();
+ auto &Context = S.getContext();
+
+ auto NameSZ = sizeof(PT_NOTE::NoteName); // Size of note name including trailing null.
+
+ S.PushSection();
+ S.SwitchSection(Context.getELFSection(
+ PT_NOTE::SectionName, ELF::SHT_NOTE, ELF::SHF_ALLOC));
+
+ // 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 *DescBegin = Context.createTempSymbol();
+ auto *DescEnd = Context.createTempSymbol();
+ auto *DescSZ = MCBinaryExpr::createSub(
+ MCSymbolRefExpr::create(DescEnd, Context),
+ MCSymbolRefExpr::create(DescBegin, Context), Context);
+
+ // Emit the note element for runtime metadata.
+ // Name and desc should be padded to 4 byte boundary but size of name and
+ // desc should not include padding 0's.
+ S.EmitIntValue(NameSZ, 4); // namesz
+ S.EmitValue(DescSZ, 4); // descz
+ S.EmitIntValue(PT_NOTE::NT_AMDGPU_HSA_RUNTIME_METADATA, 4); // type
+ S.EmitBytes(StringRef(PT_NOTE::NoteName, NameSZ)); // name
+ S.EmitValueToAlignment(4); // padding 0
+ S.EmitLabel(DescBegin);
+ emitRuntimeMetadata(M); // desc
+ S.EmitLabel(DescEnd);
+ S.EmitValueToAlignment(4); // padding 0
+ S.PopSection();
+}
+
+void AMDGPUTargetStreamer::emitRuntimeMetadata(Module &M) {
+ emitStartOfRuntimeMetadata(M);
+ for (auto &F : M.functions())
+ emitRuntimeMetadata(F);
+}
+
Modified: llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h (original)
+++ llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h Thu Nov 10 15:18:49 2016
@@ -14,9 +14,15 @@
#include "llvm/MC/MCStreamer.h"
namespace llvm {
+#include "AMDGPURuntimeMetadata.h"
+class DataLayout;
+class Function;
class MCELFStreamer;
class MCSymbol;
+class MDNode;
+class Module;
+class Type;
class AMDGPUTargetStreamer : public MCTargetStreamer {
public:
@@ -36,6 +42,36 @@ public:
virtual void EmitAMDGPUHsaModuleScopeGlobal(StringRef GlobalName) = 0;
virtual void EmitAMDGPUHsaProgramScopeGlobal(StringRef GlobalName) = 0;
+
+ /// Emit runtime metadata as a note element.
+ void emitRuntimeMetadataAsNoteElement(Module &M);
+
+private:
+ void emitRuntimeMetadata(Module &M);
+ void emitStartOfRuntimeMetadata(const Module &M);
+
+ /// Emit runtime metadata for a kernel function.
+ void emitRuntimeMetadata(const Function &F);
+
+ // Emit runtime metadata for a kernel argument.
+ void emitRuntimeMetadataForKernelArg(const DataLayout &DL,
+ Type *T, AMDGPU::RuntimeMD::KernelArg::Kind Kind,
+ StringRef BaseTypeName = "", StringRef TypeName = "",
+ StringRef ArgName = "", StringRef TypeQual = "",
+ StringRef AccQual = "");
+
+ /// Emit a key and an integer value for runtime metadata.
+ void emitRuntimeMDIntValue(AMDGPU::RuntimeMD::Key K,
+ uint64_t V, unsigned Size);
+
+ /// Emit a key and a string value for runtime metadata.
+ void emitRuntimeMDStringValue(AMDGPU::RuntimeMD::Key K,
+ StringRef S);
+
+ /// Emit a key and three integer values for runtime metadata.
+ /// The three integer values are obtained from MDNode \p Node;
+ void emitRuntimeMDThreeIntValues(AMDGPU::RuntimeMD::Key K, MDNode *Node,
+ unsigned Size);
};
class AMDGPUTargetAsmStreamer : public AMDGPUTargetStreamer {
@@ -59,19 +95,6 @@ public:
};
class AMDGPUTargetELFStreamer : public AMDGPUTargetStreamer {
-
- enum NoteType {
- NT_AMDGPU_HSA_CODE_OBJECT_VERSION = 1,
- NT_AMDGPU_HSA_HSAIL = 2,
- NT_AMDGPU_HSA_ISA = 3,
- NT_AMDGPU_HSA_PRODUCER = 4,
- NT_AMDGPU_HSA_PRODUCER_OPTIONS = 5,
- NT_AMDGPU_HSA_EXTENSION = 6,
- NT_AMDGPU_HSA_HLDEBUG_DEBUG = 101,
- NT_AMDGPU_HSA_HLDEBUG_TARGET = 102
- };
-
- static const char *NoteName;
MCStreamer &Streamer;
public:
Modified: llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata1.ll?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata1.ll (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata1.ll Thu Nov 10 15:18:49 2016
@@ -1,8 +1,10 @@
; RUN: llc -mtriple=amdgcn--amdhsa < %s | FileCheck %s
; check llc does not crash for invalid opencl version metadata
-; CHECK: .section .AMDGPU.runtime_metadata
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .short 256
+; CHECK: .section .note,#alloc
+; CHECK-NEXT: .long 4
+; CHECK-NEXT: .long {{.+}}
+; CHECK-NEXT: .long 7
+; CHECK-NEXT: .asciz "AMD"
!opencl.ocl.version = !{}
Modified: llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata2.ll?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata2.ll (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata2.ll Thu Nov 10 15:18:49 2016
@@ -1,9 +1,11 @@
; RUN: llc -mtriple=amdgcn--amdhsa < %s | FileCheck %s
; check llc does not crash for invalid opencl version metadata
-; CHECK: .section .AMDGPU.runtime_metadata
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .short 256
+; CHECK: .section .note,#alloc
+; CHECK-NEXT: .long 4
+; CHECK-NEXT: .long {{.+}}
+; CHECK-NEXT: .long 7
+; CHECK-NEXT: .asciz "AMD"
!opencl.ocl.version = !{!0}
!0 = !{}
Modified: llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata3.ll?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata3.ll (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/invalid-opencl-version-metadata3.ll Thu Nov 10 15:18:49 2016
@@ -1,9 +1,11 @@
; RUN: llc -mtriple=amdgcn--amdhsa < %s | FileCheck %s
; check llc does not crash for invalid opencl version metadata
-; CHECK: .section .AMDGPU.runtime_metadata
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .short 256
+; CHECK: .section .note,#alloc
+; CHECK-NEXT: .long 4
+; CHECK-NEXT: .long {{.+}}
+; CHECK-NEXT: .long 7
+; CHECK-NEXT: .asciz "AMD"
!opencl.ocl.version = !{!0}
!0 = !{i32 1}
Modified: llvm/trunk/test/CodeGen/AMDGPU/runtime-metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/runtime-metadata.ll?rev=286502&r1=286501&r2=286502&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/runtime-metadata.ll (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/runtime-metadata.ll Thu Nov 10 15:18:49 2016
@@ -9,7 +9,13 @@
%struct.B = type { i32 addrspace(1)*}
%opencl.clk_event_t = type opaque
-; CHECK: .section .AMDGPU.runtime_metadata
+; CHECK: .section .note,#alloc
+; CHECK-NEXT: .long 4
+; CHECK-NEXT: .long [[Ltmp1:.+]]-[[Ltmp0:.+]]
+; CHECK-NEXT: .long 7
+; CHECK-NEXT: .asciz "AMD"
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: [[Ltmp0]]:
; CHECK-NEXT: .byte 1
; CHECK-NEXT: .short 256
; CHECK-NEXT: .byte 2
@@ -23,8 +29,6 @@
; CHECK-NEXT: .long 10
; CHECK-NEXT: .ascii "2:1:8:%g\\n"
-; CHECK-LABEL:{{^}}test_char:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 9
@@ -92,8 +96,6 @@ define amdgpu_kernel void @test_char(i8
ret void
}
-; CHECK-LABEL:{{^}}test_ushort2:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 12
@@ -161,8 +163,6 @@ define amdgpu_kernel void @test_ushort2(
ret void
}
-; CHECK-LABEL:{{^}}test_int3:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 9
@@ -230,8 +230,6 @@ define amdgpu_kernel void @test_int3(<3
ret void
}
-; CHECK-LABEL:{{^}}test_ulong4:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 11
@@ -299,8 +297,6 @@ define amdgpu_kernel void @test_ulong4(<
ret void
}
-; CHECK-LABEL:{{^}}test_half8:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 10
@@ -368,8 +364,6 @@ define amdgpu_kernel void @test_half8(<8
ret void
}
-; CHECK-LABEL:{{^}}test_float16:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 12
@@ -437,8 +431,6 @@ define amdgpu_kernel void @test_float16(
ret void
}
-; CHECK-LABEL:{{^}}test_double16:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 13
@@ -506,8 +498,6 @@ define amdgpu_kernel void @test_double16
ret void
}
-; CHECK-LABEL:{{^}}test_pointer:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 12
@@ -577,8 +567,6 @@ define amdgpu_kernel void @test_pointer(
ret void
}
-; CHECK-LABEL:{{^}}test_image:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 10
@@ -648,8 +636,6 @@ define amdgpu_kernel void @test_image(%o
ret void
}
-; CHECK-LABEL:{{^}}test_sampler:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 12
@@ -717,8 +703,6 @@ define amdgpu_kernel void @test_sampler(
ret void
}
-; CHECK-LABEL:{{^}}test_queue:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 10
@@ -788,8 +772,6 @@ define amdgpu_kernel void @test_queue(%o
ret void
}
-; CHECK-LABEL:{{^}}test_struct:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 11
@@ -859,8 +841,6 @@ define amdgpu_kernel void @test_struct(%
ret void
}
-; CHECK-LABEL:{{^}}test_i128:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 9
@@ -928,8 +908,6 @@ define amdgpu_kernel void @test_i128(i12
ret void
}
-; CHECK-LABEL:{{^}}test_multi_arg:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 14
@@ -1027,8 +1005,6 @@ define amdgpu_kernel void @test_multi_ar
ret void
}
-; CHECK-LABEL:{{^}}test_addr_space:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 15
@@ -1134,8 +1110,6 @@ define amdgpu_kernel void @test_addr_spa
ret void
}
-; CHECK-LABEL:{{^}}test_type_qual:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 14
@@ -1243,8 +1217,6 @@ define amdgpu_kernel void @test_type_qua
ret void
}
-; CHECK-LABEL:{{^}}test_access_qual:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 16
@@ -1348,8 +1320,6 @@ define amdgpu_kernel void @test_access_q
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_half:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 23
@@ -1420,8 +1390,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_float:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 24
@@ -1492,8 +1460,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_double:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 25
@@ -1564,8 +1530,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_char:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 23
@@ -1636,8 +1600,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_short:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 24
@@ -1708,8 +1670,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_long:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 23
@@ -1780,8 +1740,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_vec_type_hint_unknown:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 26
@@ -1852,8 +1810,6 @@ define amdgpu_kernel void @test_vec_type
ret void
}
-; CHECK-LABEL:{{^}}test_reqd_wgs_vec_type_hint:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 27
@@ -1928,8 +1884,6 @@ define amdgpu_kernel void @test_reqd_wgs
ret void
}
-; CHECK-LABEL:{{^}}test_wgs_hint_vec_type_hint:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 27
@@ -2004,8 +1958,6 @@ define amdgpu_kernel void @test_wgs_hint
ret void
}
-; CHECK-LABEL:{{^}}test_arg_ptr_to_ptr:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 19
@@ -2075,8 +2027,6 @@ define amdgpu_kernel void @test_arg_ptr_
ret void
}
-; CHECK-LABEL:{{^}}test_arg_struct_contains_ptr:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 28
@@ -2146,8 +2096,6 @@ define amdgpu_kernel void @test_arg_stru
ret void
}
-; CHECK-LABEL:{{^}}test_arg_vector_of_ptr:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 22
@@ -2215,8 +2163,6 @@ define amdgpu_kernel void @test_arg_vect
ret void
}
-; CHECK-LABEL:{{^}}test_arg_unknown_builtin_type:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 29
@@ -2287,8 +2233,6 @@ define amdgpu_kernel void @test_arg_unkn
ret void
}
-; CHECK-LABEL:{{^}}test_pointee_align:
-; CHECK: .section .AMDGPU.runtime_metadata
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 6
; CHECK-NEXT: .long 18
@@ -2471,6 +2415,8 @@ define amdgpu_kernel void @test_arg_unkn
define amdgpu_kernel void @test_pointee_align(i64 addrspace(1)* %a, i8 addrspace(3)* %b, <2 x i8> addrspace(3)* %c, <3 x i8> addrspace(3)* %d, <4 x i8> addrspace(3)* %e, <8 x i8> addrspace(3)* %f, <16 x i8> addrspace(3)* %g) !kernel_arg_addr_space !91 !kernel_arg_access_qual !92 !kernel_arg_type !93 !kernel_arg_base_type !93 !kernel_arg_type_qual !94 {
ret void
}
+; CHECK-NEXT: [[Ltmp1]]:
+; CHECK-NEXT: .p2align 2
!llvm.printf.fmts = !{!100, !101}
More information about the llvm-commits
mailing list