Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Side by Side Diff: src/common/dwarf_cu_to_module.cc

Issue 2147523005: Initial support for dumping DWARF corresponding to Swift code (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: #else Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/common/dwarf_cu_to_module.h ('k') | src/common/dwarf_cu_to_module_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 Google Inc. 1 // Copyright (c) 2010 Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 21 matching lines...) Expand all
32 // Implement the DwarfCUToModule class; see dwarf_cu_to_module.h. 32 // Implement the DwarfCUToModule class; see dwarf_cu_to_module.h.
33 33
34 // For <inttypes.h> PRI* macros, before anything else might #include it. 34 // For <inttypes.h> PRI* macros, before anything else might #include it.
35 #ifndef __STDC_FORMAT_MACROS 35 #ifndef __STDC_FORMAT_MACROS
36 #define __STDC_FORMAT_MACROS 36 #define __STDC_FORMAT_MACROS
37 #endif /* __STDC_FORMAT_MACROS */ 37 #endif /* __STDC_FORMAT_MACROS */
38 38
39 #include "common/dwarf_cu_to_module.h" 39 #include "common/dwarf_cu_to_module.h"
40 40
41 #include <assert.h> 41 #include <assert.h>
42 #if !defined(__ANDROID__)
43 #include <cxxabi.h>
44 #endif
45 #include <inttypes.h> 42 #include <inttypes.h>
46 #include <stdint.h> 43 #include <stdint.h>
47 #include <stdio.h> 44 #include <stdio.h>
48 45
49 #include <algorithm> 46 #include <algorithm>
50 #include <utility> 47 #include <utility>
51 48
52 #include "common/dwarf_line_to_module.h" 49 #include "common/dwarf_line_to_module.h"
53 #include "common/unordered.h" 50 #include "common/unordered.h"
54 51
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 } 340 }
344 341
345 void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( 342 void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString(
346 enum DwarfAttribute attr, 343 enum DwarfAttribute attr,
347 enum DwarfForm form, 344 enum DwarfForm form,
348 const string &data) { 345 const string &data) {
349 switch (attr) { 346 switch (attr) {
350 case dwarf2reader::DW_AT_name: 347 case dwarf2reader::DW_AT_name:
351 name_attribute_ = AddStringToPool(data); 348 name_attribute_ = AddStringToPool(data);
352 break; 349 break;
353 case dwarf2reader::DW_AT_MIPS_linkage_name: { 350 case dwarf2reader::DW_AT_MIPS_linkage_name:
354 char* demangled = NULL; 351 case dwarf2reader::DW_AT_linkage_name: {
355 int status = -1; 352 string demangled;
356 #if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. 353 Language::DemangleResult result =
357 demangled = abi::__cxa_demangle(data.c_str(), NULL, NULL, &status); 354 cu_context_->language->DemangleName(data, &demangled);
358 #endif 355 switch (result) {
359 if (status != 0) { 356 case Language::kDemangleSuccess:
360 cu_context_->reporter->DemangleError(data, status); 357 demangled_name_ = AddStringToPool(demangled);
361 demangled_name_ = ""; 358 break;
362 break; 359
363 } 360 case Language::kDemangleFailure:
364 if (demangled) { 361 cu_context_->reporter->DemangleError(data);
365 demangled_name_ = AddStringToPool(demangled); 362 // fallthrough
366 free(reinterpret_cast<void*>(demangled)); 363 case Language::kDontDemangle:
364 demangled_name_.clear();
365 break;
367 } 366 }
368 break; 367 break;
369 } 368 }
370 default: break; 369 default: break;
371 } 370 }
372 } 371 }
373 372
374 string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { 373 string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() {
375 // Use the demangled name, if one is available. Demangled names are 374 // Use the demangled name, if one is available. Demangled names are
376 // preferable to those inferred from the DWARF structure because they 375 // preferable to those inferred from the DWARF structure because they
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 (line.size == 0 ? " (zero-length)" : ""), 668 (line.size == 0 ? " (zero-length)" : ""),
670 line.file->name.c_str(), line.number, line.address); 669 line.file->name.c_str(), line.number, line.address);
671 } 670 }
672 671
673 void DwarfCUToModule::WarningReporter::UnnamedFunction(uint64 offset) { 672 void DwarfCUToModule::WarningReporter::UnnamedFunction(uint64 offset) {
674 CUHeading(); 673 CUHeading();
675 fprintf(stderr, "%s: warning: function at offset 0x%llx has no name\n", 674 fprintf(stderr, "%s: warning: function at offset 0x%llx has no name\n",
676 filename_.c_str(), offset); 675 filename_.c_str(), offset);
677 } 676 }
678 677
679 void DwarfCUToModule::WarningReporter::DemangleError( 678 void DwarfCUToModule::WarningReporter::DemangleError(const string &input) {
680 const string &input, int error) {
681 CUHeading(); 679 CUHeading();
682 fprintf(stderr, "%s: warning: failed to demangle %s with error %d\n", 680 fprintf(stderr, "%s: warning: failed to demangle %s\n",
683 filename_.c_str(), input.c_str(), error); 681 filename_.c_str(), input.c_str());
684 } 682 }
685 683
686 void DwarfCUToModule::WarningReporter::UnhandledInterCUReference( 684 void DwarfCUToModule::WarningReporter::UnhandledInterCUReference(
687 uint64 offset, uint64 target) { 685 uint64 offset, uint64 target) {
688 CUHeading(); 686 CUHeading();
689 fprintf(stderr, "%s: warning: the DIE at offset 0x%llx has a " 687 fprintf(stderr, "%s: warning: the DIE at offset 0x%llx has a "
690 "DW_FORM_ref_addr attribute with an inter-CU reference to " 688 "DW_FORM_ref_addr attribute with an inter-CU reference to "
691 "0x%llx, but inter-CU reference handling is turned off.\n", 689 "0x%llx, but inter-CU reference handling is turned off.\n",
692 filename_.c_str(), offset, target); 690 filename_.c_str(), offset, target);
693 } 691 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler( 752 dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler(
755 uint64 offset, 753 uint64 offset,
756 enum DwarfTag tag) { 754 enum DwarfTag tag) {
757 switch (tag) { 755 switch (tag) {
758 case dwarf2reader::DW_TAG_subprogram: 756 case dwarf2reader::DW_TAG_subprogram:
759 return new FuncHandler(cu_context_.get(), child_context_.get(), offset); 757 return new FuncHandler(cu_context_.get(), child_context_.get(), offset);
760 case dwarf2reader::DW_TAG_namespace: 758 case dwarf2reader::DW_TAG_namespace:
761 case dwarf2reader::DW_TAG_class_type: 759 case dwarf2reader::DW_TAG_class_type:
762 case dwarf2reader::DW_TAG_structure_type: 760 case dwarf2reader::DW_TAG_structure_type:
763 case dwarf2reader::DW_TAG_union_type: 761 case dwarf2reader::DW_TAG_union_type:
762 case dwarf2reader::DW_TAG_module:
764 return new NamedScopeHandler(cu_context_.get(), child_context_.get(), 763 return new NamedScopeHandler(cu_context_.get(), child_context_.get(),
765 offset); 764 offset);
766 default: 765 default:
767 return NULL; 766 return NULL;
768 } 767 }
769 } 768 }
770 769
771 void DwarfCUToModule::SetLanguage(DwarfLanguage language) { 770 void DwarfCUToModule::SetLanguage(DwarfLanguage language) {
772 switch (language) { 771 switch (language) {
773 case dwarf2reader::DW_LANG_Java: 772 case dwarf2reader::DW_LANG_Java:
774 cu_context_->language = Language::Java; 773 cu_context_->language = Language::Java;
775 break; 774 break;
776 775
776 case dwarf2reader::DW_LANG_Swift:
777 cu_context_->language = Language::Swift;
778 break;
779
777 // DWARF has no generic language code for assembly language; this is 780 // DWARF has no generic language code for assembly language; this is
778 // what the GNU toolchain uses. 781 // what the GNU toolchain uses.
779 case dwarf2reader::DW_LANG_Mips_Assembler: 782 case dwarf2reader::DW_LANG_Mips_Assembler:
780 cu_context_->language = Language::Assembler; 783 cu_context_->language = Language::Assembler;
781 break; 784 break;
782 785
783 // C++ covers so many cases that it probably has some way to cope 786 // C++ covers so many cases that it probably has some way to cope
784 // with whatever the other languages throw at us. So make it the 787 // with whatever the other languages throw at us. So make it the
785 // default. 788 // default.
786 // 789 //
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 return dwarf_version >= 2; 1069 return dwarf_version >= 2;
1067 } 1070 }
1068 1071
1069 bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) { 1072 bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) {
1070 // We don't deal with partial compilation units (the only other tag 1073 // We don't deal with partial compilation units (the only other tag
1071 // likely to be used for root DIE). 1074 // likely to be used for root DIE).
1072 return tag == dwarf2reader::DW_TAG_compile_unit; 1075 return tag == dwarf2reader::DW_TAG_compile_unit;
1073 } 1076 }
1074 1077
1075 } // namespace google_breakpad 1078 } // namespace google_breakpad
OLDNEW
« no previous file with comments | « src/common/dwarf_cu_to_module.h ('k') | src/common/dwarf_cu_to_module_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698