Skip to content

Commit 2f5efcd

Browse files
committed
[Offload] Define additional device info properties
Add the following properties in Offload device info: * VENDOR_ID * NUM_COMPUTE_UNITS * [SINGLE|DOUBLE|HALF]_FP_CONFIG * PREFERRED_VECTOR_WIDTH_[CHAR|SHORT|INT|LONG|FLOAT|DOUBLE|HALF] * NATIVE_VECTOR_WIDTH_[CHAR|SHORT|INT|LONG|FLOAT|DOUBLE|HALF] * MAX_CLOCK_FREQUENCY * MEMORY_CLOCK_RATE * ADDRESS_BITS * MAX_MEM_ALLOC_SIZE * GLOBAL_MEM_SIZE Introduce templated enumerators in Offload TableGen to reduce code duplication for the per-type definitions. Use macros in unit test definitions to reduce code duplication.
1 parent f73a302 commit 2f5efcd

File tree

13 files changed

+454
-90
lines changed

13 files changed

+454
-90
lines changed

offload/liboffload/API/APIDefs.td

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,16 +158,32 @@ class Etor<string Name, string Desc> {
158158
string tagged_type;
159159
}
160160

161+
class EtorTemplate<string Name, string Desc, list<string> TemplateValues> : Etor<Name, Desc> {
162+
// Create Etor for every value in template_values by replacing the string
163+
// "%TEMPLATE%" with the template value in the name and description
164+
list<string> template_values = TemplateValues;
165+
}
166+
161167
class TaggedEtor<string Name, string Type, string Desc> : Etor<Name, Desc> {
162168
let tagged_type = Type;
163169
}
164170

171+
class TaggedEtorTemplate<string Name, string Type, string Desc, list<string> TemplateValues> : TaggedEtor<Name, Type, Desc> {
172+
// Create TaggedEtor for every value in template_values by replacing the
173+
// string "%TEMPLATE%" with the template value in the name and description
174+
list<string> template_values = TemplateValues;
175+
}
176+
165177
class Enum : APIObject {
166178
// This refers to whether the enumerator descriptions specify a return
167179
// type for functions where this enum may be used as an output type. If set,
168180
// all Etor values must be TaggedEtor records
169181
bit is_typed = 0;
170182

183+
// This refers to whether the enumerator is used to name bits of a bit field,
184+
// where consecutive values are bit-shifted rather than incremented.
185+
bit is_bit_field = 0;
186+
171187
list<Etor> etors = [];
172188
}
173189

offload/liboffload/API/Device.td

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,41 @@ def DeviceInfo : Enum {
3434
TaggedEtor<"DRIVER_VERSION", "char[]", "Driver version">,
3535
TaggedEtor<"MAX_WORK_GROUP_SIZE", "uint32_t", "Maximum total work group size in work items">,
3636
TaggedEtor<"MAX_WORK_GROUP_SIZE_PER_DIMENSION", "ol_dimensions_t", "Maximum work group size in each dimension">,
37+
TaggedEtor<"VENDOR_ID", "uint32_t", "A unique vendor device identifier assigned by PCI-SIG">,
38+
TaggedEtor<"NUM_COMPUTE_UNITS", "uint32_t", "The number of parallel compute units available to the device">,
39+
TaggedEtorTemplate<"%TEMPLATE%_FP_CONFIG", "ol_device_fp_capability_flags_t", "%TEMPLATE% precision floating point capability", ["Single","Half","Double"]>,
40+
TaggedEtorTemplate<"PREFERRED_VECTOR_WIDTH_%TEMPLATE%", "uint32_t", "Preferred vector width for %TEMPLATE%", ["char","short","int","long","float","double","half"]>,
41+
TaggedEtorTemplate<"NATIVE_VECTOR_WIDTH_%TEMPLATE%", "uint32_t", "Native vector width for %TEMPLATE%", ["char","short","int","long","float","double","half"]>,
42+
TaggedEtor<"MAX_CLOCK_FREQUENCY", "uint32_t", "The maximum configured clock frequency of this device in MHz">,
43+
TaggedEtor<"MEMORY_CLOCK_RATE", "uint32_t", "Memory clock frequency in MHz">,
44+
TaggedEtor<"ADDRESS_BITS", "uint32_t", "Number of bits used to represent an address in device memory">,
45+
TaggedEtor<"MAX_MEM_ALLOC_SIZE", "uint64_t", "The maximum size of memory object allocation in bytes">,
46+
TaggedEtor<"GLOBAL_MEM_SIZE", "uint64_t", "The size of global device memory in bytes">,
3747
];
3848
}
3949

50+
def : Enum {
51+
let name = "ol_device_fp_capability_flag_t";
52+
let desc = "Device floating-point capability flags";
53+
let is_bit_field = 1;
54+
let etors =[
55+
Etor<"CORRECTLY_ROUNDED_DIVIDE_SQRT", "Support correctly rounded divide and sqrt">,
56+
Etor<"ROUND_TO_NEAREST", "Support round to nearest">,
57+
Etor<"ROUND_TO_ZERO", "Support round to zero">,
58+
Etor<"ROUND_TO_INF", "Support round to infinity">,
59+
Etor<"INF_NAN", "Support INF to NAN">,
60+
Etor<"DENORM", "Support denorm">,
61+
Etor<"FMA", "Support fused multiply-add">,
62+
Etor<"SOFT_FLOAT", "Basic floating point operations implemented in software">,
63+
];
64+
}
65+
66+
def : Typedef {
67+
let name = "ol_device_fp_capability_flags_t";
68+
let desc = "Device floating-point capability flags";
69+
let value = "uint32_t";
70+
}
71+
4072
def : FptrTypedef {
4173
let name = "ol_device_iterate_cb_t";
4274
let desc = "User-provided function to be used with `olIterateDevices`";

offload/liboffload/src/OffloadImpl.cpp

Lines changed: 104 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,57 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
302302
};
303303

304304
// These are not implemented by the plugin interface
305-
if (PropName == OL_DEVICE_INFO_PLATFORM)
305+
switch (PropName) {
306+
case OL_DEVICE_INFO_PLATFORM:
306307
return Info.write<void *>(Device->Platform);
307-
if (PropName == OL_DEVICE_INFO_TYPE)
308+
309+
case OL_DEVICE_INFO_TYPE:
308310
return Info.write<ol_device_type_t>(OL_DEVICE_TYPE_GPU);
311+
312+
case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
313+
case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: {
314+
ol_device_fp_capability_flags_t flags{0};
315+
flags |= OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
316+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
317+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
318+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
319+
OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
320+
OL_DEVICE_FP_CAPABILITY_FLAG_DENORM |
321+
OL_DEVICE_FP_CAPABILITY_FLAG_FMA;
322+
return Info.write(flags);
323+
}
324+
325+
case OL_DEVICE_INFO_HALF_FP_CONFIG:
326+
return Info.write<ol_device_fp_capability_flags_t>(0);
327+
328+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR:
329+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT:
330+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT:
331+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG:
332+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT:
333+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE:
334+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
335+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
336+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
337+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
338+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
339+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
340+
return Info.write<uint32_t>(1);
341+
342+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_HALF:
343+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
344+
return Info.write<uint32_t>(0);
345+
346+
// None of the existing plugins specify a limit on a single allocation,
347+
// so return the global memory size instead
348+
case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
349+
PropName = OL_DEVICE_INFO_GLOBAL_MEM_SIZE;
350+
break;
351+
352+
default:
353+
break;
354+
}
355+
309356
if (PropName >= OL_DEVICE_INFO_LAST)
310357
return createOffloadError(ErrorCode::INVALID_ENUMERATION,
311358
"getDeviceInfo enum '%i' is invalid", PropName);
@@ -316,6 +363,7 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
316363
"plugin did not provide a response for this information");
317364
auto Entry = *EntryOpt;
318365

366+
// Retrieve properties from the plugin interface
319367
switch (PropName) {
320368
case OL_DEVICE_INFO_NAME:
321369
case OL_DEVICE_INFO_VENDOR:
@@ -327,7 +375,20 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
327375
return Info.writeString(std::get<std::string>(Entry->Value).c_str());
328376
}
329377

330-
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE: {
378+
case OL_DEVICE_INFO_GLOBAL_MEM_SIZE: {
379+
// Uint64 values
380+
if (!std::holds_alternative<uint64_t>(Entry->Value))
381+
return makeError(ErrorCode::BACKEND_FAILURE,
382+
"plugin returned incorrect type");
383+
return Info.write(std::get<uint64_t>(Entry->Value));
384+
}
385+
386+
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
387+
case OL_DEVICE_INFO_VENDOR_ID:
388+
case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
389+
case OL_DEVICE_INFO_ADDRESS_BITS:
390+
case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
391+
case OL_DEVICE_INFO_MEMORY_CLOCK_RATE: {
331392
// Uint32 values
332393
if (!std::holds_alternative<uint64_t>(Entry->Value))
333394
return makeError(ErrorCode::BACKEND_FAILURE,
@@ -389,9 +450,48 @@ Error olGetDeviceInfoImplDetailHost(ol_device_handle_t Device,
389450
case OL_DEVICE_INFO_DRIVER_VERSION:
390451
return Info.writeString(LLVM_VERSION_STRING);
391452
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
392-
return Info.write<uint64_t>(1);
453+
return Info.write<uint32_t>(1);
393454
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE_PER_DIMENSION:
394455
return Info.write<ol_dimensions_t>(ol_dimensions_t{1, 1, 1});
456+
case OL_DEVICE_INFO_VENDOR_ID:
457+
return Info.write<uint32_t>(0);
458+
case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
459+
return Info.write<uint32_t>(1);
460+
case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
461+
case OL_DEVICE_INFO_DOUBLE_FP_CONFIG:
462+
return Info.write<ol_device_fp_capability_flags_t>(
463+
OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
464+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
465+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
466+
OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
467+
OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
468+
OL_DEVICE_FP_CAPABILITY_FLAG_DENORM |
469+
OL_DEVICE_FP_CAPABILITY_FLAG_FMA);
470+
case OL_DEVICE_INFO_HALF_FP_CONFIG:
471+
return Info.write<ol_device_fp_capability_flags_t>(0);
472+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR:
473+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT:
474+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT:
475+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG:
476+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT:
477+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE:
478+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
479+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
480+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
481+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
482+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
483+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
484+
return Info.write<uint32_t>(1);
485+
case OL_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_HALF:
486+
case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
487+
return Info.write<uint32_t>(0);
488+
case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
489+
case OL_DEVICE_INFO_MEMORY_CLOCK_RATE:
490+
case OL_DEVICE_INFO_ADDRESS_BITS:
491+
return Info.write<uint32_t>(std::numeric_limits<uintptr_t>::digits);
492+
case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
493+
case OL_DEVICE_INFO_GLOBAL_MEM_SIZE:
494+
return Info.write<uint64_t>(0);
395495
default:
396496
return createOffloadError(ErrorCode::INVALID_ENUMERATION,
397497
"getDeviceInfo enum '%i' is invalid", PropName);

offload/plugins-nextgen/amdgpu/dynamic_hsa/hsa.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,16 @@ typedef enum {
7070
HSA_ISA_INFO_NAME = 1
7171
} hsa_isa_info_t;
7272

73+
typedef enum {
74+
HSA_MACHINE_MODEL_SMALL = 0,
75+
HSA_MACHINE_MODEL_LARGE = 1
76+
} hsa_machine_model_t;
77+
7378
typedef enum {
7479
HSA_AGENT_INFO_NAME = 0,
7580
HSA_AGENT_INFO_VENDOR_NAME = 1,
7681
HSA_AGENT_INFO_FEATURE = 2,
82+
HSA_AGENT_INFO_MACHINE_MODEL = 3,
7783
HSA_AGENT_INFO_PROFILE = 4,
7884
HSA_AGENT_INFO_WAVEFRONT_SIZE = 6,
7985
HSA_AGENT_INFO_WORKGROUP_MAX_DIM = 7,

offload/plugins-nextgen/amdgpu/dynamic_hsa/hsa_ext_amd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ typedef enum hsa_amd_agent_info_s {
6767
HSA_AMD_AGENT_INFO_CACHELINE_SIZE = 0xA001,
6868
HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT = 0xA002,
6969
HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY = 0xA003,
70+
HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY = 0xA008,
7071
HSA_AMD_AGENT_INFO_PRODUCT_NAME = 0xA009,
7172
HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU = 0xA00A,
7273
HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU = 0xA00B,

offload/plugins-nextgen/amdgpu/src/rtl.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,15 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
26432643
if (Status == HSA_STATUS_SUCCESS)
26442644
Info.add("Vendor Name", TmpChar, "", DeviceInfo::VENDOR);
26452645

2646+
Info.add("Vendor ID", uint64_t{4130}, "", DeviceInfo::VENDOR_ID);
2647+
2648+
hsa_machine_model_t MachineModel;
2649+
Status = getDeviceAttrRaw(HSA_AGENT_INFO_MACHINE_MODEL, MachineModel);
2650+
if (Status == HSA_STATUS_SUCCESS)
2651+
Info.add("Memory Address Size",
2652+
uint64_t{MachineModel == HSA_MACHINE_MODEL_SMALL ? 32u : 64u},
2653+
"bits", DeviceInfo::ADDRESS_BITS);
2654+
26462655
hsa_device_type_t DevType;
26472656
Status = getDeviceAttrRaw(HSA_AGENT_INFO_DEVICE, DevType);
26482657
if (Status == HSA_STATUS_SUCCESS) {
@@ -2693,11 +2702,17 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
26932702

26942703
Status = getDeviceAttrRaw(HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY, TmpUInt);
26952704
if (Status == HSA_STATUS_SUCCESS)
2696-
Info.add("Max Clock Freq", TmpUInt, "MHz");
2705+
Info.add("Max Clock Freq", TmpUInt, "MHz",
2706+
DeviceInfo::MAX_CLOCK_FREQUENCY);
2707+
2708+
Status = getDeviceAttrRaw(HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY, TmpUInt);
2709+
if (Status == HSA_STATUS_SUCCESS)
2710+
Info.add("Max Memory Clock Freq", TmpUInt, "MHz",
2711+
DeviceInfo::MEMORY_CLOCK_RATE);
26972712

26982713
Status = getDeviceAttrRaw(HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT, TmpUInt);
26992714
if (Status == HSA_STATUS_SUCCESS)
2700-
Info.add("Compute Units", TmpUInt);
2715+
Info.add("Compute Units", TmpUInt, "", DeviceInfo::NUM_COMPUTE_UNITS);
27012716

27022717
Status = getDeviceAttrRaw(HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU, TmpUInt);
27032718
if (Status == HSA_STATUS_SUCCESS)
@@ -2779,7 +2794,11 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
27792794

27802795
Status = Pool->getAttrRaw(HSA_AMD_MEMORY_POOL_INFO_SIZE, TmpSt);
27812796
if (Status == HSA_STATUS_SUCCESS)
2782-
PoolNode.add("Size", TmpSt, "bytes");
2797+
PoolNode.add(
2798+
"Size", TmpSt, "bytes",
2799+
(Pool->isGlobal() && Pool->isCoarseGrained())
2800+
? std::optional<DeviceInfo>{DeviceInfo::GLOBAL_MEM_SIZE}
2801+
: std::nullopt);
27832802

27842803
Status = Pool->getAttrRaw(HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED,
27852804
TmpBool);

offload/plugins-nextgen/cuda/src/rtl.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -951,13 +951,20 @@ struct CUDADeviceTy : public GenericDeviceTy {
951951

952952
Info.add("Vendor Name", "NVIDIA", "", DeviceInfo::VENDOR);
953953

954+
Info.add("Vendor ID", uint64_t{4318}, "", DeviceInfo::VENDOR_ID);
955+
956+
Info.add("Memory Address Size", std::numeric_limits<CUdeviceptr>::digits,
957+
"bits", DeviceInfo::ADDRESS_BITS);
958+
954959
Res = cuDeviceTotalMem(&TmpSt, Device);
955960
if (Res == CUDA_SUCCESS)
956-
Info.add("Global Memory Size", TmpSt, "bytes");
961+
Info.add("Global Memory Size", TmpSt, "bytes",
962+
DeviceInfo::GLOBAL_MEM_SIZE);
957963

958964
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, TmpInt);
959965
if (Res == CUDA_SUCCESS)
960-
Info.add("Number of Multiprocessors", TmpInt);
966+
Info.add("Number of Multiprocessors", TmpInt, "",
967+
DeviceInfo::NUM_COMPUTE_UNITS);
961968

962969
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_GPU_OVERLAP, TmpInt);
963970
if (Res == CUDA_SUCCESS)
@@ -1018,7 +1025,8 @@ struct CUDADeviceTy : public GenericDeviceTy {
10181025

10191026
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_CLOCK_RATE, TmpInt);
10201027
if (Res == CUDA_SUCCESS)
1021-
Info.add("Clock Rate", TmpInt, "kHz");
1028+
Info.add("Clock Rate", TmpInt / 1000, "MHz",
1029+
DeviceInfo::MAX_CLOCK_FREQUENCY);
10221030

10231031
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT, TmpInt);
10241032
if (Res == CUDA_SUCCESS)
@@ -1055,7 +1063,8 @@ struct CUDADeviceTy : public GenericDeviceTy {
10551063

10561064
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE, TmpInt);
10571065
if (Res == CUDA_SUCCESS)
1058-
Info.add("Memory Clock Rate", TmpInt, "kHz");
1066+
Info.add("Memory Clock Rate", TmpInt / 1000, "MHz",
1067+
DeviceInfo::MEMORY_CLOCK_RATE);
10591068

10601069
Res = getDeviceAttrRaw(CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH, TmpInt);
10611070
if (Res == CUDA_SUCCESS)

offload/tools/offload-tblgen/APIGen.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,28 @@ static void ProcessEnum(const EnumRec &Enum, raw_ostream &OS) {
131131
OS << formatv("/// @brief {0}\n", Enum.getDesc());
132132
OS << formatv("typedef enum {0} {{\n", Enum.getName());
133133

134-
uint32_t EtorVal = 0;
134+
uint32_t EtorVal = Enum.isBitField();
135135
for (const auto &EnumVal : Enum.getValues()) {
136-
if (Enum.isTyped()) {
137-
OS << MakeComment(
138-
formatv("[{0}] {1}", EnumVal.getTaggedType(), EnumVal.getDesc())
139-
.str());
140-
} else {
141-
OS << MakeComment(EnumVal.getDesc());
136+
for (size_t TemplateIndex{0};
137+
TemplateIndex == 0 ||
138+
TemplateIndex < EnumVal.getTemplateValues().size();
139+
++TemplateIndex) {
140+
std::string Name{EnumVal.getTemplateName(TemplateIndex)};
141+
std::string Desc{EnumVal.getTemplateDesc(TemplateIndex)};
142+
if (Enum.isTyped()) {
143+
OS << MakeComment(
144+
formatv("[{0}] {1}", EnumVal.getTaggedType(), Desc).str());
145+
} else {
146+
OS << MakeComment(Desc);
147+
}
148+
OS << formatv(TAB_1 "{0}_{1} = {2},\n", Enum.getEnumValNamePrefix(), Name,
149+
EtorVal);
150+
if (Enum.isBitField()) {
151+
EtorVal <<= 1u;
152+
} else {
153+
++EtorVal;
154+
}
142155
}
143-
OS << formatv(TAB_1 "{0}_{1} = {2},\n", Enum.getEnumValNamePrefix(),
144-
EnumVal.getName(), EtorVal++);
145156
}
146157

147158
// Add last_element/force uint32 val

offload/tools/offload-tblgen/MiscGen.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,22 @@ void EmitOffloadInfo(const RecordKeeper &Records, raw_ostream &OS) {
107107
108108
)";
109109

110-
auto ErrorCodeEnum = EnumRec{Records.getDef("DeviceInfo")};
111-
uint32_t EtorVal = 0;
112-
for (const auto &EnumVal : ErrorCodeEnum.getValues()) {
113-
OS << formatv(TAB_1 "OFFLOAD_DEVINFO({0}, \"{1}\", {2})\n",
114-
EnumVal.getName(), EnumVal.getDesc(), EtorVal++);
110+
auto Enum = EnumRec{Records.getDef("DeviceInfo")};
111+
112+
uint32_t EtorVal = Enum.isBitField();
113+
for (const auto &EnumVal : Enum.getValues()) {
114+
for (size_t TemplateIndex{0};
115+
TemplateIndex == 0 ||
116+
TemplateIndex < EnumVal.getTemplateValues().size();
117+
++TemplateIndex) {
118+
OS << formatv(TAB_1 "OFFLOAD_DEVINFO({0}, \"{1}\", {2})\n",
119+
EnumVal.getTemplateName(TemplateIndex),
120+
EnumVal.getTemplateDesc(TemplateIndex), EtorVal);
121+
if (Enum.isBitField()) {
122+
EtorVal <<= 1u;
123+
} else {
124+
++EtorVal;
125+
}
126+
}
115127
}
116128
}

0 commit comments

Comments
 (0)