Skip to content

Commit 1984f01

Browse files
committed
[mlir][LLVM] Add base type and flag support to composite type
This requires defining the DIFlag enum from LLVM. Differential Revision: https://reviews.llvm.org/D137667
1 parent f45c21d commit 1984f01

File tree

4 files changed

+108
-5
lines changed

4 files changed

+108
-5
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ def LLVM_DICompositeTypeAttr : LLVM_Attr<"DICompositeType", "di_composite_type",
176176
OptionalParameter<"DIFileAttr">:$file,
177177
"uint32_t":$line,
178178
OptionalParameter<"DIScopeAttr">:$scope,
179+
OptionalParameter<"DITypeAttr">:$baseType,
180+
OptionalParameter<"DIFlags", "DIFlags::Zero">:$flags,
179181
"uint64_t":$sizeInBits,
180182
"uint64_t":$alignInBits,
181183
OptionalArrayRefParameter<"DINodeAttr">:$elements

mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,100 @@ def LLVM_DIEmissionKind : I64EnumAttr<
224224
let cppNamespace = "::mlir::LLVM";
225225
}
226226

227+
//===----------------------------------------------------------------------===//
228+
// DIFlags
229+
//===----------------------------------------------------------------------===//
230+
231+
def LLVM_DIFlagZero : I32BitEnumAttrCaseNone<"Zero">;
232+
233+
// The first two bits are used for a visibility enum.
234+
// * Private = 1
235+
// * Protected = 2
236+
// * Public = 3
237+
def LLVM_DIFlagVisibilityBit0 : I32BitEnumAttrCaseBit<"Bit0", 0>;
238+
def LLVM_DIFlagVisibilityBit1 : I32BitEnumAttrCaseBit<"Bit1", 1>;
239+
def LLVM_DIFlagPrivate : I32BitEnumAttrCaseGroup<"Private",
240+
[LLVM_DIFlagVisibilityBit0]
241+
>;
242+
def LLVM_DIFlagProtected : I32BitEnumAttrCaseGroup<"Protected",
243+
[LLVM_DIFlagVisibilityBit1]
244+
>;
245+
def LLVM_DIFlagPublic : I32BitEnumAttrCaseGroup<"Public",
246+
[LLVM_DIFlagVisibilityBit0, LLVM_DIFlagVisibilityBit1]
247+
>;
248+
249+
// The remaining bits are used for the various flags.
250+
def LLVM_DIFlagFwdDecl : I32BitEnumAttrCaseBit<"FwdDecl", 2>;
251+
def LLVM_DIFlagAppleBlock : I32BitEnumAttrCaseBit<"AppleBlock", 3>;
252+
def LLVM_DIFlagReservedBit4 : I32BitEnumAttrCaseBit<"ReservedBit4", 4>;
253+
def LLVM_DIFlagVirtual : I32BitEnumAttrCaseBit<"Virtual", 5>;
254+
def LLVM_DIFlagArtificial : I32BitEnumAttrCaseBit<"Artificial", 6>;
255+
def LLVM_DIFlagExplicit : I32BitEnumAttrCaseBit<"Explicit", 7>;
256+
def LLVM_DIFlagPrototyped : I32BitEnumAttrCaseBit<"Prototyped", 8>;
257+
def LLVM_DIFlagObjcClassComplete : I32BitEnumAttrCaseBit<"ObjcClassComplete", 9>;
258+
def LLVM_DIFlagObjectPointer : I32BitEnumAttrCaseBit<"ObjectPointer", 10>;
259+
def LLVM_DIFlagVector : I32BitEnumAttrCaseBit<"Vector", 11>;
260+
def LLVM_DIFlagStaticMember : I32BitEnumAttrCaseBit<"StaticMember", 12>;
261+
def LLVM_DIFlagLValueReference : I32BitEnumAttrCaseBit<"LValueReference", 13>;
262+
def LLVM_DIFlagRValueReference : I32BitEnumAttrCaseBit<"RValueReference", 14>;
263+
def LLVM_DIFlagExportSymbols : I32BitEnumAttrCaseBit<"ExportSymbols", 15>;
264+
def LLVM_DIFlagSingleInheritance : I32BitEnumAttrCaseBit<"SingleInheritance", 16>;
265+
def LLVM_DIFlagMultipleInheritance : I32BitEnumAttrCaseBit<"MultipleInheritance", 16>;
266+
def LLVM_DIFlagVirtualInheritance : I32BitEnumAttrCaseBit<"VirtualInheritance", 16>;
267+
def LLVM_DIFlagIntroducedVirtual : I32BitEnumAttrCaseBit<"IntroducedVirtual", 18>;
268+
def LLVM_DIFlagBitField : I32BitEnumAttrCaseBit<"BitField", 19>;
269+
def LLVM_DIFlagNoReturn : I32BitEnumAttrCaseBit<"NoReturn", 20>;
270+
def LLVM_DIFlagTypePassByValue : I32BitEnumAttrCaseBit<"TypePassByValue", 22>;
271+
def LLVM_DIFlagTypePassByReference : I32BitEnumAttrCaseBit<"TypePassByReference", 23>;
272+
def LLVM_DIFlagEnumClass : I32BitEnumAttrCaseBit<"EnumClass", 24>;
273+
def LLVM_DIFlagThunk : I32BitEnumAttrCaseBit<"Thunk", 25>;
274+
def LLVM_DIFlagNonTrivial : I32BitEnumAttrCaseBit<"NonTrivial", 26>;
275+
def LLVM_DIFlagBigEndian : I32BitEnumAttrCaseBit<"BigEndian", 27>;
276+
def LLVM_DIFlagLittleEndian : I32BitEnumAttrCaseBit<"LittleEndian", 28>;
277+
def LLVM_DIFlagAllCallsDescribed : I32BitEnumAttrCaseBit<"AllCallsDescribed", 29>;
278+
279+
def DIFlags : I32BitEnumAttr<
280+
"DIFlags",
281+
"LLVM DI flags", [
282+
LLVM_DIFlagZero,
283+
LLVM_DIFlagVisibilityBit0,
284+
LLVM_DIFlagVisibilityBit1,
285+
LLVM_DIFlagPrivate,
286+
LLVM_DIFlagProtected,
287+
LLVM_DIFlagPublic,
288+
LLVM_DIFlagFwdDecl,
289+
LLVM_DIFlagAppleBlock,
290+
LLVM_DIFlagReservedBit4,
291+
LLVM_DIFlagVirtual,
292+
LLVM_DIFlagArtificial,
293+
LLVM_DIFlagExplicit,
294+
LLVM_DIFlagPrototyped,
295+
LLVM_DIFlagObjcClassComplete,
296+
LLVM_DIFlagObjectPointer,
297+
LLVM_DIFlagVector,
298+
LLVM_DIFlagStaticMember,
299+
LLVM_DIFlagLValueReference,
300+
LLVM_DIFlagRValueReference,
301+
LLVM_DIFlagExportSymbols,
302+
LLVM_DIFlagSingleInheritance,
303+
LLVM_DIFlagMultipleInheritance,
304+
LLVM_DIFlagVirtualInheritance,
305+
LLVM_DIFlagIntroducedVirtual,
306+
LLVM_DIFlagBitField,
307+
LLVM_DIFlagNoReturn,
308+
LLVM_DIFlagTypePassByValue,
309+
LLVM_DIFlagTypePassByReference,
310+
LLVM_DIFlagEnumClass,
311+
LLVM_DIFlagThunk,
312+
LLVM_DIFlagNonTrivial,
313+
LLVM_DIFlagBigEndian,
314+
LLVM_DIFlagLittleEndian,
315+
LLVM_DIFlagAllCallsDescribed
316+
]> {
317+
let cppNamespace = "::mlir::LLVM";
318+
let printBitEnumPrimaryGroups = 1;
319+
}
320+
227321
//===----------------------------------------------------------------------===//
228322
// DISubprogramFlags
229323
//===----------------------------------------------------------------------===//

mlir/lib/Target/LLVMIR/DebugTranslation.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,10 @@ DebugTranslation::translateImpl(DICompositeTypeAttr attr) {
108108
elements.push_back(translate(member));
109109
return llvm::DICompositeType::get(
110110
llvmCtx, attr.getTag(), attr.getName(), translate(attr.getFile()),
111-
attr.getLine(), translate(attr.getScope()), /*BaseType=*/nullptr,
111+
attr.getLine(), translate(attr.getScope()), translate(attr.getBaseType()),
112112
attr.getSizeInBits(), attr.getAlignInBits(),
113-
/*OffsetInBits=*/0, /*Flags=*/llvm::DINode::FlagZero,
113+
/*OffsetInBits=*/0,
114+
/*Flags=*/static_cast<llvm::DINode::DIFlags>(attr.getFlags()),
114115
llvm::MDNode::get(llvmCtx, elements),
115116
/*RuntimeLang=*/0, /*VTableHolder=*/nullptr);
116117
}

mlir/test/Target/LLVMIR/llvmir-debug.mlir

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ llvm.func @func_no_debug() {
3232
line = 0, sizeInBits = 0, alignInBits = 0,
3333
elements = #llvm.di_subrange<count = 4>
3434
>
35-
#spType = #llvm.di_subroutine_type<callingConvention = DW_CC_normal, types = #si64, #composite>
35+
#vector = #llvm.di_composite_type<
36+
tag = DW_TAG_array_type, name = "array", file = #file,
37+
line = 0, baseType = #si64, sizeInBits = 0, alignInBits = 0,
38+
flags = Vector,
39+
elements = #llvm.di_subrange<count = 4>
40+
>
41+
#spType = #llvm.di_subroutine_type<callingConvention = DW_CC_normal, types = #si64, #composite, #vector>
3642
#sp = #llvm.di_subprogram<
3743
compileUnit = #cu, scope = #file, name = "intrinsics", linkageName = "intrinsics",
3844
file = #file, line = 3, scopeLine = 3, subprogramFlags = "Definition|Optimized", type = #spType
@@ -74,12 +80,12 @@ llvm.func @func_with_debug(%arg: i64) {
7480

7581
// CHECK: ![[FUNC_LOC]] = distinct !DISubprogram(name: "intrinsics", linkageName: "intrinsics", scope: ![[CU_FILE_LOC]], file: ![[CU_FILE_LOC]], line: 3, type: ![[FUNC_TYPE:.*]], scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: ![[CU_LOC]])
7682
// CHECK: ![[FUNC_TYPE]] = !DISubroutineType(cc: DW_CC_normal, types: ![[ARG_TYPES:.*]])
77-
// CHECK: ![[ARG_TYPES]] = !{![[ARG_TYPE:.*]], ![[COMPOSITE_TYPE:.*]]}
83+
// CHECK: ![[ARG_TYPES]] = !{![[ARG_TYPE:.*]], ![[COMPOSITE_TYPE:.*]], ![[VECTOR_TYPE:.*]]}
7884
// CHECK: ![[ARG_TYPE]] = !DIBasicType(name: "si64", encoding: DW_ATE_signed)
7985
// CHECK: ![[COMPOSITE_TYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "composite", file: ![[CU_FILE_LOC]], elements: ![[COMPOSITE_ELEMENTS:.*]])
8086
// CHECK: ![[COMPOSITE_ELEMENTS]] = !{![[COMPOSITE_ELEMENT:.*]]}
8187
// CHECK: ![[COMPOSITE_ELEMENT]] = !DISubrange(count: 4)
82-
88+
// CHECK: ![[VECTOR_TYPE]] = !DICompositeType(tag: DW_TAG_array_type, name: "array", file: ![[CU_FILE_LOC]], baseType: ![[ARG_TYPE]], flags: DIFlagVector
8389
// CHECK: ![[VAR_LOC]] = !DILocalVariable(name: "arg", arg: 1, scope: ![[VAR_SCOPE:.*]], file: ![[CU_FILE_LOC]], line: 6, type: ![[ARG_TYPE]])
8490
// CHECK: ![[VAR_SCOPE]] = distinct !DILexicalBlockFile(scope: ![[FUNC_LOC]], file: ![[CU_FILE_LOC]], discriminator: 0)
8591

0 commit comments

Comments
 (0)