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