Index: llvm/trunk/lib/Target/BPF/BTFDebug.h =================================================================== --- llvm/trunk/lib/Target/BPF/BTFDebug.h +++ llvm/trunk/lib/Target/BPF/BTFDebug.h @@ -100,11 +100,10 @@ /// Handle array type. class BTFTypeArray : public BTFTypeBase { - const DICompositeType *ATy; struct BTF::BTFArray ArrayInfo; public: - BTFTypeArray(const DICompositeType *ATy); + BTFTypeArray(uint32_t ElemTypeId, uint32_t NumElems); uint32_t getSize() { return BTFTypeBase::getSize() + BTF::BTFArraySize; } void completeType(BTFDebug &BDebug); void emitType(MCStreamer &OS); Index: llvm/trunk/lib/Target/BPF/BTFDebug.cpp =================================================================== --- llvm/trunk/lib/Target/BPF/BTFDebug.cpp +++ llvm/trunk/lib/Target/BPF/BTFDebug.cpp @@ -158,45 +158,24 @@ } } -BTFTypeArray::BTFTypeArray(const DICompositeType *ATy) : ATy(ATy) { +BTFTypeArray::BTFTypeArray(uint32_t ElemTypeId, uint32_t NumElems) { Kind = BTF::BTF_KIND_ARRAY; + BTFType.NameOff = 0; BTFType.Info = Kind << 24; + BTFType.Size = 0; + + ArrayInfo.ElemType = ElemTypeId; + ArrayInfo.Nelems = NumElems; } -/// Represent a BTF array. BTF does not record array dimensions, -/// so conceptually a BTF array is a one-dimensional array. +/// Represent a BTF array. void BTFTypeArray::completeType(BTFDebug &BDebug) { - BTFType.NameOff = BDebug.addString(ATy->getName()); - BTFType.Size = 0; - - auto *BaseType = ATy->getBaseType().resolve(); - ArrayInfo.ElemType = BDebug.getTypeId(BaseType); // The IR does not really have a type for the index. // A special type for array index should have been // created during initial type traversal. Just // retrieve that type id. ArrayInfo.IndexType = BDebug.getArrayIndexTypeId(); - - // Get the number of array elements. - // If the array size is 0, set the number of elements as 0. - // Otherwise, recursively traverse the base types to - // find the element size. The number of elements is - // the totoal array size in bits divided by - // element size in bits. - uint64_t ArraySizeInBits = ATy->getSizeInBits(); - if (!ArraySizeInBits) { - ArrayInfo.Nelems = 0; - } else { - uint32_t BaseTypeSize = BaseType->getSizeInBits(); - while (!BaseTypeSize) { - const auto *DDTy = cast(BaseType); - BaseType = DDTy->getBaseType().resolve(); - assert(BaseType); - BaseTypeSize = BaseType->getSizeInBits(); - } - ArrayInfo.Nelems = ATy->getSizeInBits() / BaseTypeSize; - } } void BTFTypeArray::emitType(MCStreamer &OS) { @@ -447,8 +426,34 @@ } void BTFDebug::visitArrayType(const DICompositeType *CTy, uint32_t &TypeId) { - auto TypeEntry = llvm::make_unique(CTy); - TypeId = addType(std::move(TypeEntry), CTy); + // Visit array element type. + uint32_t ElemTypeId; + visitTypeEntry(CTy->getBaseType().resolve(), ElemTypeId); + + if (!CTy->getSizeInBits()) { + auto TypeEntry = llvm::make_unique(ElemTypeId, 0); + ElemTypeId = addType(std::move(TypeEntry), CTy); + } else { + // Visit array dimensions. + DINodeArray Elements = CTy->getElements(); + for (int I = Elements.size() - 1; I >= 0; --I) { + if (auto *Element = dyn_cast_or_null(Elements[I])) + if (Element->getTag() == dwarf::DW_TAG_subrange_type) { + const DISubrange *SR = cast(Element); + auto *CI = SR->getCount().dyn_cast(); + int64_t Count = CI->getSExtValue(); + + auto TypeEntry = llvm::make_unique(ElemTypeId, Count); + if (I == 0) + ElemTypeId = addType(std::move(TypeEntry), CTy); + else + ElemTypeId = addType(std::move(TypeEntry)); + } + } + } + + // The array TypeId is the type id of the outermost dimension. + TypeId = ElemTypeId; // The IR does not have a type for array index while BTF wants one. // So create an array index type if there is none. @@ -457,9 +462,6 @@ 0, "__ARRAY_SIZE_TYPE__"); ArrayIndexTypeId = addType(std::move(TypeEntry)); } - - // Visit array element type. - visitTypeEntry(CTy->getBaseType().resolve()); } void BTFDebug::visitEnumType(const DICompositeType *CTy, uint32_t &TypeId) { Index: llvm/trunk/test/CodeGen/BPF/BTF/array-1d-char.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/array-1d-char.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/array-1d-char.ll @@ -21,24 +21,24 @@ ; CHECK-NEXT: .long 56 ; CHECK-NEXT: .long 56 ; CHECK-NEXT: .long 26 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 1) +; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 1) +; CHECK-NEXT: .long 16777216 # 0x1000000 +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long 16777224 # 0x1000008 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 2) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 1 ; CHECK-NEXT: .long 3 -; CHECK-NEXT: .long 2 ; CHECK-NEXT: .long 10 -; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 2) +; CHECK-NEXT: .long 6 # BTF_KIND_INT(id = 3) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 21 # BTF_KIND_INT(id = 3) -; CHECK-NEXT: .long 16777216 # 0x1000000 -; CHECK-NEXT: .long 1 -; CHECK-NEXT: .long 16777224 # 0x1000008 ; CHECK-NEXT: .byte 0 # string offset=0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=1 +; CHECK-NEXT: .ascii "char" # string offset=1 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "char" # string offset=21 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=6 ; CHECK-NEXT: .byte 0 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) Index: llvm/trunk/test/CodeGen/BPF/BTF/array-1d-int.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/array-1d-int.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/array-1d-int.ll @@ -21,24 +21,24 @@ ; CHECK-NEXT: .long 56 ; CHECK-NEXT: .long 56 ; CHECK-NEXT: .long 25 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 1) +; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 1) +; CHECK-NEXT: .long 16777216 # 0x1000000 +; CHECK-NEXT: .long 4 +; CHECK-NEXT: .long 16777248 # 0x1000020 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 2) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 1 ; CHECK-NEXT: .long 3 -; CHECK-NEXT: .long 2 ; CHECK-NEXT: .long 10 -; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 2) +; CHECK-NEXT: .long 5 # BTF_KIND_INT(id = 3) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 21 # BTF_KIND_INT(id = 3) -; CHECK-NEXT: .long 16777216 # 0x1000000 -; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 16777248 # 0x1000020 ; CHECK-NEXT: .byte 0 # string offset=0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=1 +; CHECK-NEXT: .ascii "int" # string offset=1 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "int" # string offset=21 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=5 ; CHECK-NEXT: .byte 0 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) Index: llvm/trunk/test/CodeGen/BPF/BTF/array-2d-int.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/array-2d-int.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/array-2d-int.ll @@ -18,27 +18,33 @@ ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .long 24 ; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 56 -; CHECK-NEXT: .long 56 +; CHECK-NEXT: .long 80 +; CHECK-NEXT: .long 80 ; CHECK-NEXT: .long 25 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 1) +; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 1) +; CHECK-NEXT: .long 16777216 # 0x1000000 +; CHECK-NEXT: .long 4 +; CHECK-NEXT: .long 16777248 # 0x1000020 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 2) +; CHECK-NEXT: .long 50331648 # 0x3000000 +; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long 4 +; CHECK-NEXT: .long 10 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 3) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 3 ; CHECK-NEXT: .long 2 -; CHECK-NEXT: .long 100 -; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 2) -; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 21 # BTF_KIND_INT(id = 3) +; CHECK-NEXT: .long 10 +; CHECK-NEXT: .long 5 # BTF_KIND_INT(id = 4) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 16777248 # 0x1000020 +; CHECK-NEXT: .long 32 # 0x20 ; CHECK-NEXT: .byte 0 # string offset=0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=1 +; CHECK-NEXT: .ascii "int" # string offset=1 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "int" # string offset=21 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=5 ; CHECK-NEXT: .byte 0 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) Index: llvm/trunk/test/CodeGen/BPF/BTF/array-size-0.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/array-size-0.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/array-size-0.ll @@ -24,23 +24,23 @@ ; CHECK-NEXT: .long 52 ; CHECK-NEXT: .long 52 ; CHECK-NEXT: .long 23 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 1) +; CHECK-NEXT: .long 1 # BTF_KIND_STRUCT(id = 1) +; CHECK-NEXT: .long 67108864 # 0x4000000 +; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 2) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 1 ; CHECK-NEXT: .long 3 -; CHECK-NEXT: .long 2 ; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 2) +; CHECK-NEXT: .long 3 # BTF_KIND_INT(id = 3) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 21 # BTF_KIND_STRUCT(id = 3) -; CHECK-NEXT: .long 67108864 # 0x4000000 -; CHECK-NEXT: .long 0 ; CHECK-NEXT: .byte 0 # string offset=0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=1 +; CHECK-NEXT: .byte 116 # string offset=1 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .byte 116 # string offset=21 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=3 ; CHECK-NEXT: .byte 0 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) Index: llvm/trunk/test/CodeGen/BPF/BTF/array-typedef.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/array-typedef.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/array-typedef.ll @@ -23,34 +23,34 @@ ; CHECK-NEXT: .long 80 ; CHECK-NEXT: .long 80 ; CHECK-NEXT: .long 45 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 1) -; CHECK-NEXT: .long 50331648 # 0x3000000 -; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 3 +; CHECK-NEXT: .long 1 # BTF_KIND_TYPEDEF(id = 1) +; CHECK-NEXT: .long 134217728 # 0x8000000 ; CHECK-NEXT: .long 2 -; CHECK-NEXT: .long 10 -; CHECK-NEXT: .long 1 # BTF_KIND_INT(id = 2) +; CHECK-NEXT: .long 7 # BTF_KIND_TYPEDEF(id = 2) +; CHECK-NEXT: .long 134217728 # 0x8000000 +; CHECK-NEXT: .long 3 +; CHECK-NEXT: .long 12 # BTF_KIND_INT(id = 3) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 21 # BTF_KIND_TYPEDEF(id = 3) -; CHECK-NEXT: .long 134217728 # 0x8000000 -; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 27 # BTF_KIND_TYPEDEF(id = 4) -; CHECK-NEXT: .long 134217728 # 0x8000000 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 4) +; CHECK-NEXT: .long 50331648 # 0x3000000 +; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 1 ; CHECK-NEXT: .long 5 -; CHECK-NEXT: .long 32 # BTF_KIND_INT(id = 5) +; CHECK-NEXT: .long 10 +; CHECK-NEXT: .long 25 # BTF_KIND_INT(id = 5) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 ; CHECK-NEXT: .byte 0 # string offset=0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=1 +; CHECK-NEXT: .ascii "__int" # string offset=1 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "__int" # string offset=21 +; CHECK-NEXT: .ascii "_int" # string offset=7 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "_int" # string offset=27 +; CHECK-NEXT: .ascii "unsigned int" # string offset=12 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "unsigned int" # string offset=32 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=25 ; CHECK-NEXT: .byte 0 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) Index: llvm/trunk/test/CodeGen/BPF/BTF/static-var-zerolen-array.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/static-var-zerolen-array.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/static-var-zerolen-array.ll @@ -52,22 +52,22 @@ ; CHECK-NEXT: .long 2 ; CHECK-NEXT: .long 32 # 0x20 ; CHECK-NEXT: .long 59 -; CHECK-NEXT: .long 6 +; CHECK-NEXT: .long 7 ; CHECK-NEXT: .long 64 # 0x40 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 6) +; CHECK-NEXT: .long 61 # BTF_KIND_INT(id = 6) +; CHECK-NEXT: .long 16777216 # 0x1000000 +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long 16777224 # 0x1000008 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 7) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 6 ; CHECK-NEXT: .long 8 -; CHECK-NEXT: .long 7 ; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 61 # BTF_KIND_INT(id = 7) +; CHECK-NEXT: .long 66 # BTF_KIND_INT(id = 8) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 81 # BTF_KIND_INT(id = 8) -; CHECK-NEXT: .long 16777216 # 0x1000000 -; CHECK-NEXT: .long 1 -; CHECK-NEXT: .long 16777224 # 0x1000008 ; CHECK-NEXT: .long 86 # BTF_KIND_VAR(id = 9) ; CHECK-NEXT: .long 234881024 # 0xe000000 ; CHECK-NEXT: .long 4 @@ -95,9 +95,9 @@ ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .byte 99 # string offset=59 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=61 +; CHECK-NEXT: .ascii "char" # string offset=61 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "char" # string offset=81 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=66 ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .ascii "sv" # string offset=86 ; CHECK-NEXT: .byte 0 Index: llvm/trunk/test/CodeGen/BPF/BTF/union-array-typedef.ll =================================================================== --- llvm/trunk/test/CodeGen/BPF/BTF/union-array-typedef.ll +++ llvm/trunk/test/CodeGen/BPF/BTF/union-array-typedef.ll @@ -28,25 +28,25 @@ ; CHECK-NEXT: .long 83886082 # 0x5000002 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 3 -; CHECK-NEXT: .long 2 -; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 3 +; CHECK-NEXT: .long 0 # 0x0 ; CHECK-NEXT: .long 5 ; CHECK-NEXT: .long 5 -; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 2) +; CHECK-NEXT: .long 0 # 0x0 +; CHECK-NEXT: .long 7 # BTF_KIND_INT(id = 2) +; CHECK-NEXT: .long 16777216 # 0x1000000 +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long 16777224 # 0x1000008 +; CHECK-NEXT: .long 0 # BTF_KIND_ARRAY(id = 3) ; CHECK-NEXT: .long 50331648 # 0x3000000 ; CHECK-NEXT: .long 0 +; CHECK-NEXT: .long 2 ; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 3 ; CHECK-NEXT: .long 4 -; CHECK-NEXT: .long 7 # BTF_KIND_INT(id = 3) +; CHECK-NEXT: .long 12 # BTF_KIND_INT(id = 4) ; CHECK-NEXT: .long 16777216 # 0x1000000 ; CHECK-NEXT: .long 4 ; CHECK-NEXT: .long 32 # 0x20 -; CHECK-NEXT: .long 27 # BTF_KIND_INT(id = 4) -; CHECK-NEXT: .long 16777216 # 0x1000000 -; CHECK-NEXT: .long 1 -; CHECK-NEXT: .long 16777224 # 0x1000008 ; CHECK-NEXT: .long 32 # BTF_KIND_TYPEDEF(id = 5) ; CHECK-NEXT: .long 134217728 # 0x8000000 ; CHECK-NEXT: .long 6 @@ -61,9 +61,9 @@ ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .byte 110 # string offset=5 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=7 +; CHECK-NEXT: .ascii "char" # string offset=7 ; CHECK-NEXT: .byte 0 -; CHECK-NEXT: .ascii "char" # string offset=27 +; CHECK-NEXT: .ascii "__ARRAY_SIZE_TYPE__" # string offset=12 ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .ascii "_int" # string offset=32 ; CHECK-NEXT: .byte 0