1 //===-- llvm/CodeGen/DwarfExpression.cpp - Dwarf Debug Framework ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains support for writing dwarf debug info into asm files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "DwarfExpression.h" 15 #include "DwarfDebug.h" 16 #include "llvm/ADT/SmallBitVector.h" 17 #include "llvm/BinaryFormat/Dwarf.h" 18 #include "llvm/CodeGen/AsmPrinter.h" 19 #include "llvm/Target/TargetMachine.h" 20 #include "llvm/Target/TargetRegisterInfo.h" 21 #include "llvm/Target/TargetSubtargetInfo.h" 22 23 using namespace llvm; 24 25 void DwarfExpression::addReg(int DwarfReg, const char *Comment) { 26 assert(DwarfReg >= 0 && "invalid negative dwarf register number"); 27 assert((LocationKind == Unknown || LocationKind == Register) && 28 "location description already locked down"); 29 LocationKind = Register; 30 if (DwarfReg < 32) { 31 emitOp(dwarf::DW_OP_reg0 + DwarfReg, Comment); 32 } else { 33 emitOp(dwarf::DW_OP_regx, Comment); 34 emitUnsigned(DwarfReg); 35 } 36 } 37 38 void DwarfExpression::addBReg(int DwarfReg, int Offset) { 39 assert(DwarfReg >= 0 && "invalid negative dwarf register number"); 40 assert(LocationKind != Register && "location description already locked down"); 41 if (DwarfReg < 32) { 42 emitOp(dwarf::DW_OP_breg0 + DwarfReg); 43 } else { 44 emitOp(dwarf::DW_OP_bregx); 45 emitUnsigned(DwarfReg); 46 } 47 emitSigned(Offset); 48 } 49 50 void DwarfExpression::addFBReg(int Offset) { 51 emitOp(dwarf::DW_OP_fbreg); 52 emitSigned(Offset); 53 } 54 55 void DwarfExpression::addOpPiece(unsigned SizeInBits, unsigned OffsetInBits) { 56 if (!SizeInBits) 57 return; 58 59 const unsigned SizeOfByte = 8; 60 if (OffsetInBits > 0 || SizeInBits % SizeOfByte) { 61 emitOp(dwarf::DW_OP_bit_piece); 62 emitUnsigned(SizeInBits); 63 emitUnsigned(OffsetInBits); 64 } else { 65 emitOp(dwarf::DW_OP_piece); 66 unsigned ByteSize = SizeInBits / SizeOfByte; 67 emitUnsigned(ByteSize); 68 } 69 this->OffsetInBits += SizeInBits; 70 } 71 72 void DwarfExpression::addShr(unsigned ShiftBy) { 73 emitOp(dwarf::DW_OP_constu); 74 emitUnsigned(ShiftBy); 75 emitOp(dwarf::DW_OP_shr); 76 } 77 78 void DwarfExpression::addAnd(unsigned Mask) { 79 emitOp(dwarf::DW_OP_constu); 80 emitUnsigned(Mask); 81 emitOp(dwarf::DW_OP_and); 82 } 83 84 bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI, 85 unsigned MachineReg, unsigned MaxSize) { 86 if (!TRI.isPhysicalRegister(MachineReg)) { 87 if (isFrameRegister(TRI, MachineReg)) { 88 DwarfRegs.push_back({-1, 0, nullptr}); 89 return true; 90 } 91 return false; 92 } 93 94 int Reg = TRI.getDwarfRegNum(MachineReg, false); 95 96 // If this is a valid register number, emit it. 97 if (Reg >= 0) { 98 DwarfRegs.push_back({Reg, 0, nullptr}); 99 return true; 100 } 101 102 // Walk up the super-register chain until we find a valid number. 103 // For example, EAX on x86_64 is a 32-bit fragment of RAX with offset 0. 104 for (MCSuperRegIterator SR(MachineReg, &TRI); SR.isValid(); ++SR) { 105 Reg = TRI.getDwarfRegNum(*SR, false); 106 if (Reg >= 0) { 107 unsigned Idx = TRI.getSubRegIndex(*SR, MachineReg); 108 unsigned Size = TRI.getSubRegIdxSize(Idx); 109 unsigned RegOffset = TRI.getSubRegIdxOffset(Idx); 110 DwarfRegs.push_back({Reg, 0, "super-register"}); 111 // Use a DW_OP_bit_piece to describe the sub-register. 112 setSubRegisterPiece(Size, RegOffset); 113 return true; 114 } 115 } 116 117 // Otherwise, attempt to find a covering set of sub-register numbers. 118 // For example, Q0 on ARM is a composition of D0+D1. 119 unsigned CurPos = 0; 120 // The size of the register in bits. 121 const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(MachineReg); 122 unsigned RegSize = TRI.getRegSizeInBits(*RC); 123 // Keep track of the bits in the register we already emitted, so we 124 // can avoid emitting redundant aliasing subregs. 125 SmallBitVector Coverage(RegSize, false); 126 for (MCSubRegIterator SR(MachineReg, &TRI); SR.isValid(); ++SR) { 127 unsigned Idx = TRI.getSubRegIndex(MachineReg, *SR); 128 unsigned Size = TRI.getSubRegIdxSize(Idx); 129 unsigned Offset = TRI.getSubRegIdxOffset(Idx); 130 Reg = TRI.getDwarfRegNum(*SR, false); 131 132 // Intersection between the bits we already emitted and the bits 133 // covered by this subregister. 134 SmallBitVector CurSubReg(RegSize, false); 135 CurSubReg.set(Offset, Offset + Size); 136 137 // If this sub-register has a DWARF number and we haven't covered 138 // its range, emit a DWARF piece for it. 139 if (Reg >= 0 && CurSubReg.test(Coverage)) { 140 // Emit a piece for any gap in the coverage. 141 if (Offset > CurPos) 142 DwarfRegs.push_back({-1, Offset - CurPos, nullptr}); 143 DwarfRegs.push_back( 144 {Reg, std::min<unsigned>(Size, MaxSize - Offset), "sub-register"}); 145 if (Offset >= MaxSize) 146 break; 147 148 // Mark it as emitted. 149 Coverage.set(Offset, Offset + Size); 150 CurPos = Offset + Size; 151 } 152 } 153 154 return CurPos; 155 } 156 157 void DwarfExpression::addStackValue() { 158 if (DwarfVersion >= 4) 159 emitOp(dwarf::DW_OP_stack_value); 160 } 161 162 void DwarfExpression::addSignedConstant(int64_t Value) { 163 assert(LocationKind == Implicit || LocationKind == Unknown); 164 LocationKind = Implicit; 165 emitOp(dwarf::DW_OP_consts); 166 emitSigned(Value); 167 } 168 169 void DwarfExpression::addUnsignedConstant(uint64_t Value) { 170 assert(LocationKind == Implicit || LocationKind == Unknown); 171 LocationKind = Implicit; 172 emitOp(dwarf::DW_OP_constu); 173 emitUnsigned(Value); 174 } 175 176 void DwarfExpression::addUnsignedConstant(const APInt &Value) { 177 assert(LocationKind == Implicit || LocationKind == Unknown); 178 LocationKind = Implicit; 179 180 unsigned Size = Value.getBitWidth(); 181 const uint64_t *Data = Value.getRawData(); 182 183 // Chop it up into 64-bit pieces, because that's the maximum that 184 // addUnsignedConstant takes. 185 unsigned Offset = 0; 186 while (Offset < Size) { 187 addUnsignedConstant(*Data++); 188 if (Offset == 0 && Size <= 64) 189 break; 190 addStackValue(); 191 addOpPiece(std::min(Size - Offset, 64u), Offset); 192 Offset += 64; 193 } 194 } 195 196 bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI, 197 DIExpressionCursor &ExprCursor, 198 unsigned MachineReg, 199 unsigned FragmentOffsetInBits) { 200 auto Fragment = ExprCursor.getFragmentInfo(); 201 if (!addMachineReg(TRI, MachineReg, Fragment ? Fragment->SizeInBits : ~1U)) { 202 LocationKind = Unknown; 203 return false; 204 } 205 206 bool HasComplexExpression = false; 207 auto Op = ExprCursor.peek(); 208 if (Op && Op->getOp() != dwarf::DW_OP_LLVM_fragment) 209 HasComplexExpression = true; 210 211 // If the register can only be described by a complex expression (i.e., 212 // multiple subregisters) it doesn't safely compose with another complex 213 // expression. For example, it is not possible to apply a DW_OP_deref 214 // operation to multiple DW_OP_pieces. 215 if (HasComplexExpression && DwarfRegs.size() > 1) { 216 DwarfRegs.clear(); 217 LocationKind = Unknown; 218 return false; 219 } 220 221 // Handle simple register locations. 222 if (LocationKind != Memory && !HasComplexExpression) { 223 for (auto &Reg : DwarfRegs) { 224 if (Reg.DwarfRegNo >= 0) 225 addReg(Reg.DwarfRegNo, Reg.Comment); 226 addOpPiece(Reg.Size); 227 } 228 DwarfRegs.clear(); 229 return true; 230 } 231 232 // Don't emit locations that cannot be expressed without DW_OP_stack_value. 233 if (DwarfVersion < 4) 234 if (std::any_of(ExprCursor.begin(), ExprCursor.end(), 235 [](DIExpression::ExprOperand Op) -> bool { 236 return Op.getOp() == dwarf::DW_OP_stack_value; 237 })) { 238 DwarfRegs.clear(); 239 LocationKind = Unknown; 240 return false; 241 } 242 243 assert(DwarfRegs.size() == 1); 244 auto Reg = DwarfRegs[0]; 245 bool FBReg = isFrameRegister(TRI, MachineReg); 246 int SignedOffset = 0; 247 assert(Reg.Size == 0 && "subregister has same size as superregister"); 248 249 // Pattern-match combinations for which more efficient representations exist. 250 // [Reg, DW_OP_plus_uconst, Offset] --> [DW_OP_breg, Offset]. 251 if (Op && (Op->getOp() == dwarf::DW_OP_plus_uconst)) { 252 SignedOffset = Op->getArg(0); 253 ExprCursor.take(); 254 } 255 256 // [Reg, DW_OP_constu, Offset, DW_OP_plus] --> [DW_OP_breg, Offset] 257 // [Reg, DW_OP_constu, Offset, DW_OP_minus] --> [DW_OP_breg,-Offset] 258 // If Reg is a subregister we need to mask it out before subtracting. 259 if (Op && Op->getOp() == dwarf::DW_OP_constu) { 260 auto N = ExprCursor.peekNext(); 261 if (N && (N->getOp() == dwarf::DW_OP_plus || 262 (N->getOp() == dwarf::DW_OP_minus && !SubRegisterSizeInBits))) { 263 int Offset = Op->getArg(0); 264 SignedOffset = (N->getOp() == dwarf::DW_OP_minus) ? -Offset : Offset; 265 ExprCursor.consume(2); 266 } 267 } 268 269 if (FBReg) 270 addFBReg(SignedOffset); 271 else 272 addBReg(Reg.DwarfRegNo, SignedOffset); 273 DwarfRegs.clear(); 274 return true; 275 } 276 277 /// Assuming a well-formed expression, match "DW_OP_deref* DW_OP_LLVM_fragment?". 278 static bool isMemoryLocation(DIExpressionCursor ExprCursor) { 279 while (ExprCursor) { 280 auto Op = ExprCursor.take(); 281 switch (Op->getOp()) { 282 case dwarf::DW_OP_deref: 283 case dwarf::DW_OP_LLVM_fragment: 284 break; 285 default: 286 return false; 287 } 288 } 289 return true; 290 } 291 292 void DwarfExpression::addExpression(DIExpressionCursor &&ExprCursor, 293 unsigned FragmentOffsetInBits) { 294 // If we need to mask out a subregister, do it now, unless the next 295 // operation would emit an OpPiece anyway. 296 auto N = ExprCursor.peek(); 297 if (SubRegisterSizeInBits && N && (N->getOp() != dwarf::DW_OP_LLVM_fragment)) 298 maskSubRegister(); 299 300 while (ExprCursor) { 301 auto Op = ExprCursor.take(); 302 switch (Op->getOp()) { 303 case dwarf::DW_OP_LLVM_fragment: { 304 unsigned SizeInBits = Op->getArg(1); 305 unsigned FragmentOffset = Op->getArg(0); 306 // The fragment offset must have already been adjusted by emitting an 307 // empty DW_OP_piece / DW_OP_bit_piece before we emitted the base 308 // location. 309 assert(OffsetInBits >= FragmentOffset && "fragment offset not added?"); 310 311 // If addMachineReg already emitted DW_OP_piece operations to represent 312 // a super-register by splicing together sub-registers, subtract the size 313 // of the pieces that was already emitted. 314 SizeInBits -= OffsetInBits - FragmentOffset; 315 316 // If addMachineReg requested a DW_OP_bit_piece to stencil out a 317 // sub-register that is smaller than the current fragment's size, use it. 318 if (SubRegisterSizeInBits) 319 SizeInBits = std::min<unsigned>(SizeInBits, SubRegisterSizeInBits); 320 321 // Emit a DW_OP_stack_value for implicit location descriptions. 322 if (LocationKind == Implicit) 323 addStackValue(); 324 325 // Emit the DW_OP_piece. 326 addOpPiece(SizeInBits, SubRegisterOffsetInBits); 327 setSubRegisterPiece(0, 0); 328 // Reset the location description kind. 329 LocationKind = Unknown; 330 return; 331 } 332 case dwarf::DW_OP_plus_uconst: 333 assert(LocationKind != Register); 334 emitOp(dwarf::DW_OP_plus_uconst); 335 emitUnsigned(Op->getArg(0)); 336 break; 337 case dwarf::DW_OP_plus: 338 case dwarf::DW_OP_minus: 339 emitOp(Op->getOp()); 340 break; 341 case dwarf::DW_OP_deref: { 342 assert(LocationKind != Register); 343 if (LocationKind != Memory && isMemoryLocation(ExprCursor)) 344 // Turning this into a memory location description makes the deref 345 // implicit. 346 LocationKind = Memory; 347 else 348 emitOp(dwarf::DW_OP_deref); 349 break; 350 } 351 case dwarf::DW_OP_constu: 352 assert(LocationKind != Register); 353 emitOp(dwarf::DW_OP_constu); 354 emitUnsigned(Op->getArg(0)); 355 break; 356 case dwarf::DW_OP_stack_value: 357 LocationKind = Implicit; 358 break; 359 case dwarf::DW_OP_swap: 360 assert(LocationKind != Register); 361 emitOp(dwarf::DW_OP_swap); 362 break; 363 case dwarf::DW_OP_xderef: 364 assert(LocationKind != Register); 365 emitOp(dwarf::DW_OP_xderef); 366 break; 367 default: 368 llvm_unreachable("unhandled opcode found in expression"); 369 } 370 } 371 372 if (LocationKind == Implicit) 373 // Turn this into an implicit location description. 374 addStackValue(); 375 } 376 377 /// add masking operations to stencil out a subregister. 378 void DwarfExpression::maskSubRegister() { 379 assert(SubRegisterSizeInBits && "no subregister was registered"); 380 if (SubRegisterOffsetInBits > 0) 381 addShr(SubRegisterOffsetInBits); 382 uint64_t Mask = (1ULL << (uint64_t)SubRegisterSizeInBits) - 1ULL; 383 addAnd(Mask); 384 } 385 386 387 void DwarfExpression::finalize() { 388 assert(DwarfRegs.size() == 0 && "dwarf registers not emitted"); 389 // Emit any outstanding DW_OP_piece operations to mask out subregisters. 390 if (SubRegisterSizeInBits == 0) 391 return; 392 // Don't emit a DW_OP_piece for a subregister at offset 0. 393 if (SubRegisterOffsetInBits == 0) 394 return; 395 addOpPiece(SubRegisterSizeInBits, SubRegisterOffsetInBits); 396 } 397 398 void DwarfExpression::addFragmentOffset(const DIExpression *Expr) { 399 if (!Expr || !Expr->isFragment()) 400 return; 401 402 uint64_t FragmentOffset = Expr->getFragmentInfo()->OffsetInBits; 403 assert(FragmentOffset >= OffsetInBits && 404 "overlapping or duplicate fragments"); 405 if (FragmentOffset > OffsetInBits) 406 addOpPiece(FragmentOffset - OffsetInBits); 407 OffsetInBits = FragmentOffset; 408 } 409