| 107 | } |
| 108 | |
| 109 | DataType GraphStruct::dataType() { |
| 110 | // if we have already calculated this, use that |
| 111 | if (mDataType.valid()) { return mDataType; } |
| 112 | |
| 113 | if (types().empty()) { return {}; } |
| 114 | |
| 115 | // create llvm::Type |
| 116 | std::vector<llvm::Type*> llTypes; |
| 117 | llTypes.reserve(types().size()); |
| 118 | |
| 119 | std::vector< |
| 120 | #if LLVM_VERSION_LESS_EQUAL(3, 5) |
| 121 | llvm::Value* |
| 122 | #else |
| 123 | llvm::Metadata* |
| 124 | #endif |
| 125 | > |
| 126 | diTypes; |
| 127 | diTypes.reserve(types().size()); |
| 128 | |
| 129 | size_t currentOffset = 0; |
| 130 | |
| 131 | #if LLVM_VERSION_LESS_EQUAL(3, 6) |
| 132 | // make a temp module so we can make a DIBuilder |
| 133 | auto tmpMod = std::make_unique<llvm::Module>("tmp", context().llvmContext()); |
| 134 | auto diBuilder = std::make_unique<llvm::DIBuilder>(*tmpMod); |
| 135 | #endif |
| 136 | |
| 137 | for (const auto& type : types()) { |
| 138 | auto debugType = type.type.debugType(); |
| 139 | |
| 140 | llTypes.push_back(type.type.llvmType()); |
| 141 | |
| 142 | auto member = |
| 143 | #if LLVM_VERSION_LESS_EQUAL(3, 6) |
| 144 | diBuilder->createMemberType(llvm::DIDescriptor(), type.name, llvm::DIFile(), 0, |
| 145 | debugType->getSizeInBits(), 8, currentOffset, 0, *debugType) |
| 146 | #else |
| 147 | llvm::DIDerivedType::get(context().llvmContext(), llvm::dwarf::DW_TAG_member, |
| 148 | #if LLVM_VERSION_LESS_EQUAL(3, 8) |
| 149 | llvm::MDString::get(context().llvmContext(), type.name), |
| 150 | #else |
| 151 | type.name, |
| 152 | #endif |
| 153 | nullptr, 0, nullptr, debugType, debugType->getSizeInBits(), 8, |
| 154 | currentOffset, llvm::DINode::DIFlags{}, nullptr) |
| 155 | #endif |
| 156 | ; |
| 157 | diTypes.push_back(member); |
| 158 | |
| 159 | currentOffset += debugType->getSizeInBits(); |
| 160 | } |
| 161 | auto llType = llvm::StructType::create(llTypes, name()); |
| 162 | |
| 163 | auto diStructType = |
| 164 | #if LLVM_VERSION_LESS_EQUAL(3, 6) |
| 165 | new llvm::DICompositeType(diBuilder->createStructType( |
| 166 | llvm::DIDescriptor(), name(), llvm::DIFile(), 0, currentOffset, 8, 0, llvm::DIType(), |
no test coverage detected