Add support for separating strings for the split debug info DWARF5
[oota-llvm.git] / lib / DebugInfo / DWARFDebugInfoEntry.cpp
1 //===-- DWARFDebugInfoEntry.cpp -------------------------------------------===//
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 #include "DWARFDebugInfoEntry.h"
11 #include "DWARFCompileUnit.h"
12 #include "DWARFContext.h"
13 #include "DWARFDebugAbbrev.h"
14 #include "DWARFFormValue.h"
15 #include "llvm/Support/Debug.h"
16 #include "llvm/Support/Dwarf.h"
17 #include "llvm/Support/Format.h"
18 #include "llvm/Support/raw_ostream.h"
19 using namespace llvm;
20 using namespace dwarf;
21
22 void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS,
23                                       const DWARFCompileUnit *cu,
24                                       unsigned recurseDepth,
25                                       unsigned indent) const {
26   DataExtractor debug_info_data = cu->getDebugInfoExtractor();
27   uint32_t offset = Offset;
28
29   if (debug_info_data.isValidOffset(offset)) {
30     uint32_t abbrCode = debug_info_data.getULEB128(&offset);
31
32     OS << format("\n0x%8.8x: ", Offset);
33     if (abbrCode) {
34       if (AbbrevDecl) {
35         const char *tagString = TagString(getTag());
36         if (tagString)
37           OS.indent(indent) << tagString;
38         else
39           OS.indent(indent) << format("DW_TAG_Unknown_%x", getTag());
40         OS << format(" [%u] %c\n", abbrCode,
41                      AbbrevDecl->hasChildren() ? '*' : ' ');
42
43         // Dump all data in the DIE for the attributes.
44         const uint32_t numAttributes = AbbrevDecl->getNumAttributes();
45         for (uint32_t i = 0; i != numAttributes; ++i) {
46           uint16_t attr = AbbrevDecl->getAttrByIndex(i);
47           uint16_t form = AbbrevDecl->getFormByIndex(i);
48           dumpAttribute(OS, cu, &offset, attr, form, indent);
49         }
50
51         const DWARFDebugInfoEntryMinimal *child = getFirstChild();
52         if (recurseDepth > 0 && child) {
53           while (child) {
54             child->dump(OS, cu, recurseDepth-1, indent+2);
55             child = child->getSibling();
56           }
57         }
58       } else {
59         OS << "Abbreviation code not found in 'debug_abbrev' class for code: "
60            << abbrCode << '\n';
61       }
62     } else {
63       OS.indent(indent) << "NULL\n";
64     }
65   }
66 }
67
68 void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS,
69                                                const DWARFCompileUnit *cu,
70                                                uint32_t* offset_ptr,
71                                                uint16_t attr,
72                                                uint16_t form,
73                                                unsigned indent) const {
74   OS << format("0x%8.8x: ", *offset_ptr);
75   OS.indent(indent+2);
76   const char *attrString = AttributeString(attr);
77   if (attrString)
78     OS << attrString;
79   else
80     OS << format("DW_AT_Unknown_%x", attr);
81   const char *formString = FormEncodingString(form);
82   if (formString)
83     OS << " [" << formString << ']';
84   else
85     OS << format(" [DW_FORM_Unknown_%x]", form);
86
87   DWARFFormValue formValue(form);
88
89   if (!formValue.extractValue(cu->getDebugInfoExtractor(), offset_ptr, cu))
90     return;
91
92   OS << "\t(";
93   formValue.dump(OS, cu);
94   OS << ")\n";
95 }
96
97 bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *cu,
98                                              const uint8_t *fixed_form_sizes,
99                                              uint32_t *offset_ptr) {
100   Offset = *offset_ptr;
101
102   DataExtractor debug_info_data = cu->getDebugInfoExtractor();
103   uint64_t abbrCode = debug_info_data.getULEB128(offset_ptr);
104
105   assert(fixed_form_sizes); // For best performance this should be specified!
106
107   if (abbrCode) {
108     uint32_t offset = *offset_ptr;
109
110     AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode);
111
112     // Skip all data in the .debug_info for the attributes
113     const uint32_t numAttributes = AbbrevDecl->getNumAttributes();
114     uint32_t i;
115     uint16_t form;
116     for (i=0; i<numAttributes; ++i) {
117
118       form = AbbrevDecl->getFormByIndex(i);
119
120       // FIXME: Currently we're checking if this is less than the last
121       // entry in the fixed_form_sizes table, but this should be changed
122       // to use dynamic dispatch.
123       const uint8_t fixed_skip_size = (form < DW_FORM_ref_sig8) ?
124                                        fixed_form_sizes[form] : 0;
125       if (fixed_skip_size)
126         offset += fixed_skip_size;
127       else {
128         bool form_is_indirect = false;
129         do {
130           form_is_indirect = false;
131           uint32_t form_size = 0;
132           switch (form) {
133           // Blocks if inlined data that have a length field and the data bytes
134           // inlined in the .debug_info.
135           case DW_FORM_exprloc:
136           case DW_FORM_block:
137             form_size = debug_info_data.getULEB128(&offset);
138             break;
139           case DW_FORM_block1:
140             form_size = debug_info_data.getU8(&offset);
141             break;
142           case DW_FORM_block2:
143             form_size = debug_info_data.getU16(&offset);
144             break;
145           case DW_FORM_block4:
146             form_size = debug_info_data.getU32(&offset);
147             break;
148
149           // Inlined NULL terminated C-strings
150           case DW_FORM_string:
151             debug_info_data.getCStr(&offset);
152             break;
153
154           // Compile unit address sized values
155           case DW_FORM_addr:
156           case DW_FORM_ref_addr:
157             form_size = cu->getAddressByteSize();
158             break;
159
160           // 0 sized form.
161           case DW_FORM_flag_present:
162             form_size = 0;
163             break;
164
165           // 1 byte values
166           case DW_FORM_data1:
167           case DW_FORM_flag:
168           case DW_FORM_ref1:
169             form_size = 1;
170             break;
171
172           // 2 byte values
173           case DW_FORM_data2:
174           case DW_FORM_ref2:
175             form_size = 2;
176             break;
177
178           // 4 byte values
179           case DW_FORM_strp:
180           case DW_FORM_data4:
181           case DW_FORM_ref4:
182             form_size = 4;
183             break;
184
185           // 8 byte values
186           case DW_FORM_data8:
187           case DW_FORM_ref8:
188           case DW_FORM_ref_sig8:
189             form_size = 8;
190             break;
191
192           // signed or unsigned LEB 128 values
193           case DW_FORM_sdata:
194           case DW_FORM_udata:
195           case DW_FORM_ref_udata:
196           case DW_FORM_GNU_str_index:
197           case DW_FORM_GNU_addr_index:
198             debug_info_data.getULEB128(&offset);
199             break;
200
201           case DW_FORM_indirect:
202             form_is_indirect = true;
203             form = debug_info_data.getULEB128(&offset);
204             break;
205
206           case DW_FORM_sec_offset:
207             if (cu->getAddressByteSize() == 4)
208               debug_info_data.getU32(offset_ptr);
209             else
210               debug_info_data.getU64(offset_ptr);
211             break;
212
213           default:
214             *offset_ptr = Offset;
215             return false;
216           }
217           offset += form_size;
218         } while (form_is_indirect);
219       }
220     }
221     *offset_ptr = offset;
222     return true;
223   } else {
224     AbbrevDecl = NULL;
225     return true; // NULL debug tag entry
226   }
227 }
228
229 bool
230 DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *cu,
231                                     uint32_t *offset_ptr) {
232   DataExtractor debug_info_data = cu->getDebugInfoExtractor();
233   const uint32_t cu_end_offset = cu->getNextCompileUnitOffset();
234   const uint8_t cu_addr_size = cu->getAddressByteSize();
235   uint32_t offset = *offset_ptr;
236   if ((offset < cu_end_offset) && debug_info_data.isValidOffset(offset)) {
237     Offset = offset;
238
239     uint64_t abbrCode = debug_info_data.getULEB128(&offset);
240
241     if (abbrCode) {
242       AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode);
243
244       if (AbbrevDecl) {
245         uint16_t tag = AbbrevDecl->getTag();
246
247         bool isCompileUnitTag = tag == DW_TAG_compile_unit;
248         if(cu && isCompileUnitTag)
249           const_cast<DWARFCompileUnit*>(cu)->setBaseAddress(0);
250
251         // Skip all data in the .debug_info for the attributes
252         const uint32_t numAttributes = AbbrevDecl->getNumAttributes();
253         for (uint32_t i = 0; i != numAttributes; ++i) {
254           uint16_t attr = AbbrevDecl->getAttrByIndex(i);
255           uint16_t form = AbbrevDecl->getFormByIndex(i);
256
257           if (isCompileUnitTag &&
258               ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc))) {
259             DWARFFormValue form_value(form);
260             if (form_value.extractValue(debug_info_data, &offset, cu)) {
261               if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc)
262                 const_cast<DWARFCompileUnit*>(cu)
263                   ->setBaseAddress(form_value.getUnsigned());
264             }
265           } else {
266             bool form_is_indirect = false;
267             do {
268               form_is_indirect = false;
269               register uint32_t form_size = 0;
270               switch (form) {
271               // Blocks if inlined data that have a length field and the data
272               // bytes // inlined in the .debug_info
273               case DW_FORM_exprloc:
274               case DW_FORM_block:
275                 form_size = debug_info_data.getULEB128(&offset);
276                 break;
277               case DW_FORM_block1:
278                 form_size = debug_info_data.getU8(&offset);
279                 break;
280               case DW_FORM_block2:
281                 form_size = debug_info_data.getU16(&offset);
282                 break;
283               case DW_FORM_block4:
284                 form_size = debug_info_data.getU32(&offset);
285                 break;
286
287               // Inlined NULL terminated C-strings
288               case DW_FORM_string:
289                 debug_info_data.getCStr(&offset);
290                 break;
291
292               // Compile unit address sized values
293               case DW_FORM_addr:
294               case DW_FORM_ref_addr:
295                 form_size = cu_addr_size;
296                 break;
297
298               // 0 byte value
299               case DW_FORM_flag_present:
300                 form_size = 0;
301                 break;
302
303               // 1 byte values
304               case DW_FORM_data1:
305               case DW_FORM_flag:
306               case DW_FORM_ref1:
307                 form_size = 1;
308                 break;
309
310               // 2 byte values
311               case DW_FORM_data2:
312               case DW_FORM_ref2:
313                 form_size = 2;
314                 break;
315
316                 // 4 byte values
317               case DW_FORM_strp:
318                 form_size = 4;
319                 break;
320
321               case DW_FORM_data4:
322               case DW_FORM_ref4:
323                 form_size = 4;
324                 break;
325
326               // 8 byte values
327               case DW_FORM_data8:
328               case DW_FORM_ref8:
329               case DW_FORM_ref_sig8:
330                 form_size = 8;
331                 break;
332
333               // signed or unsigned LEB 128 values
334               case DW_FORM_sdata:
335               case DW_FORM_udata:
336               case DW_FORM_ref_udata:
337               case DW_FORM_GNU_str_index:
338               case DW_FORM_GNU_addr_index:
339                 debug_info_data.getULEB128(&offset);
340                 break;
341
342               case DW_FORM_indirect:
343                 form = debug_info_data.getULEB128(&offset);
344                 form_is_indirect = true;
345                 break;
346
347               case DW_FORM_sec_offset:
348                 if (cu->getAddressByteSize() == 4)
349                   debug_info_data.getU32(offset_ptr);
350                 else
351                   debug_info_data.getU64(offset_ptr);
352                 break;
353
354               default:
355                 *offset_ptr = offset;
356                 return false;
357               }
358
359               offset += form_size;
360             } while (form_is_indirect);
361           }
362         }
363         *offset_ptr = offset;
364         return true;
365       }
366     } else {
367       AbbrevDecl = NULL;
368       *offset_ptr = offset;
369       return true;    // NULL debug tag entry
370     }
371   }
372
373   return false;
374 }
375
376 bool DWARFDebugInfoEntryMinimal::isSubprogramDIE() const {
377   return getTag() == DW_TAG_subprogram;
378 }
379
380 bool DWARFDebugInfoEntryMinimal::isSubroutineDIE() const {
381   uint32_t Tag = getTag();
382   return Tag == DW_TAG_subprogram ||
383          Tag == DW_TAG_inlined_subroutine;
384 }
385
386 uint32_t
387 DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu,
388                                               const uint16_t attr,
389                                               DWARFFormValue &form_value,
390                                               uint32_t *end_attr_offset_ptr)
391                                               const {
392   if (AbbrevDecl) {
393     uint32_t attr_idx = AbbrevDecl->findAttributeIndex(attr);
394
395     if (attr_idx != -1U) {
396       uint32_t offset = getOffset();
397
398       DataExtractor debug_info_data = cu->getDebugInfoExtractor();
399
400       // Skip the abbreviation code so we are at the data for the attributes
401       debug_info_data.getULEB128(&offset);
402
403       uint32_t idx = 0;
404       while (idx < attr_idx)
405         DWARFFormValue::skipValue(AbbrevDecl->getFormByIndex(idx++),
406                                   debug_info_data, &offset, cu);
407
408       const uint32_t attr_offset = offset;
409       form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx));
410       if (form_value.extractValue(debug_info_data, &offset, cu)) {
411         if (end_attr_offset_ptr)
412           *end_attr_offset_ptr = offset;
413         return attr_offset;
414       }
415     }
416   }
417
418   return 0;
419 }
420
421 const char*
422 DWARFDebugInfoEntryMinimal::getAttributeValueAsString(
423                                                      const DWARFCompileUnit* cu,
424                                                      const uint16_t attr,
425                                                      const char* fail_value)
426                                                      const {
427   DWARFFormValue form_value;
428   if (getAttributeValue(cu, attr, form_value)) {
429     DataExtractor stringExtractor(cu->getStringSection(), false, 0);
430     return form_value.getAsCString(&stringExtractor);
431   }
432   return fail_value;
433 }
434
435 uint64_t
436 DWARFDebugInfoEntryMinimal::getAttributeValueAsUnsigned(
437                                                     const DWARFCompileUnit* cu,
438                                                     const uint16_t attr,
439                                                     uint64_t fail_value) const {
440   DWARFFormValue form_value;
441   if (getAttributeValue(cu, attr, form_value))
442       return form_value.getUnsigned();
443   return fail_value;
444 }
445
446 int64_t
447 DWARFDebugInfoEntryMinimal::getAttributeValueAsSigned(
448                                                      const DWARFCompileUnit* cu,
449                                                      const uint16_t attr,
450                                                      int64_t fail_value) const {
451   DWARFFormValue form_value;
452   if (getAttributeValue(cu, attr, form_value))
453       return form_value.getSigned();
454   return fail_value;
455 }
456
457 uint64_t
458 DWARFDebugInfoEntryMinimal::getAttributeValueAsReference(
459                                                      const DWARFCompileUnit* cu,
460                                                      const uint16_t attr,
461                                                      uint64_t fail_value)
462                                                      const {
463   DWARFFormValue form_value;
464   if (getAttributeValue(cu, attr, form_value))
465       return form_value.getReference(cu);
466   return fail_value;
467 }
468
469 bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFCompileUnit *CU,
470                                                  uint64_t &LowPC,
471                                                  uint64_t &HighPC) const {
472   HighPC = -1ULL;
473   LowPC = getAttributeValueAsUnsigned(CU, DW_AT_low_pc, -1ULL);
474   if (LowPC != -1ULL)
475     HighPC = getAttributeValueAsUnsigned(CU, DW_AT_high_pc, -1ULL);
476   return (HighPC != -1ULL);
477 }
478
479 void
480 DWARFDebugInfoEntryMinimal::buildAddressRangeTable(const DWARFCompileUnit *CU,
481                                                DWARFDebugAranges *DebugAranges)
482                                                    const {
483   if (AbbrevDecl) {
484     if (isSubprogramDIE()) {
485       uint64_t LowPC, HighPC;
486       if (getLowAndHighPC(CU, LowPC, HighPC)) {
487         DebugAranges->appendRange(CU->getOffset(), LowPC, HighPC);
488       }
489       // FIXME: try to append ranges from .debug_ranges section.
490     }
491
492     const DWARFDebugInfoEntryMinimal *child = getFirstChild();
493     while (child) {
494       child->buildAddressRangeTable(CU, DebugAranges);
495       child = child->getSibling();
496     }
497   }
498 }
499
500 bool
501 DWARFDebugInfoEntryMinimal::addressRangeContainsAddress(
502                                                      const DWARFCompileUnit *CU,
503                                                      const uint64_t Address)
504                                                      const {
505   if (isNULL())
506     return false;
507   uint64_t LowPC, HighPC;
508   if (getLowAndHighPC(CU, LowPC, HighPC))
509     return (LowPC <= Address && Address <= HighPC);
510   // Try to get address ranges from .debug_ranges section.
511   uint32_t RangesOffset = getAttributeValueAsReference(CU, DW_AT_ranges, -1U);
512   if (RangesOffset != -1U) {
513     DWARFDebugRangeList RangeList;
514     if (CU->extractRangeList(RangesOffset, RangeList))
515       return RangeList.containsAddress(CU->getBaseAddress(), Address);
516   }
517   return false;
518 }
519
520 const char*
521 DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFCompileUnit *CU)
522                                                                          const {
523   if (!isSubroutineDIE())
524     return 0;
525   // Try to get mangled name if possible.
526   if (const char *name =
527       getAttributeValueAsString(CU, DW_AT_MIPS_linkage_name, 0))
528     return name;
529   if (const char *name = getAttributeValueAsString(CU, DW_AT_linkage_name, 0))
530     return name;
531   if (const char *name = getAttributeValueAsString(CU, DW_AT_name, 0))
532     return name;
533   // Try to get name from specification DIE.
534   uint32_t spec_ref =
535       getAttributeValueAsReference(CU, DW_AT_specification, -1U);
536   if (spec_ref != -1U) {
537     DWARFDebugInfoEntryMinimal spec_die;
538     if (spec_die.extract(CU, &spec_ref)) {
539       if (const char *name = spec_die.getSubroutineName(CU))
540         return name;
541     }
542   }
543   // Try to get name from abstract origin DIE.
544   uint32_t abs_origin_ref =
545       getAttributeValueAsReference(CU, DW_AT_abstract_origin, -1U);
546   if (abs_origin_ref != -1U) {
547     DWARFDebugInfoEntryMinimal abs_origin_die;
548     if (abs_origin_die.extract(CU, &abs_origin_ref)) {
549       if (const char *name = abs_origin_die.getSubroutineName(CU))
550         return name;
551     }
552   }
553   return 0;
554 }
555
556 void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFCompileUnit *CU,
557                                                 uint32_t &CallFile,
558                                                 uint32_t &CallLine,
559                                                 uint32_t &CallColumn) const {
560   CallFile = getAttributeValueAsUnsigned(CU, DW_AT_call_file, 0);
561   CallLine = getAttributeValueAsUnsigned(CU, DW_AT_call_line, 0);
562   CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0);
563 }
564
565 DWARFDebugInfoEntryMinimal::InlinedChain
566 DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
567                                                      const DWARFCompileUnit *CU,
568                                                      const uint64_t Address)
569                                                      const {
570   DWARFDebugInfoEntryMinimal::InlinedChain InlinedChain;
571   if (isNULL())
572     return InlinedChain;
573   for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) {
574     // Append current DIE to inlined chain only if it has correct tag
575     // (e.g. it is not a lexical block).
576     if (DIE->isSubroutineDIE()) {
577       InlinedChain.push_back(*DIE);
578     }
579     // Try to get child which also contains provided address.
580     const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild();
581     while (Child) {
582       if (Child->addressRangeContainsAddress(CU, Address)) {
583         // Assume there is only one such child.
584         break;
585       }
586       Child = Child->getSibling();
587     }
588     DIE = Child;
589   }
590   // Reverse the obtained chain to make the root of inlined chain last.
591   std::reverse(InlinedChain.begin(), InlinedChain.end());
592   return InlinedChain;
593 }