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

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: Pass through mangled Swift names; support DWARF 4's DW_AT_linkage_name Created 4 years, 3 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
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 int status = cu_context_->language->DemangleName(data,
357 demangled = abi::__cxa_demangle(data.c_str(), NULL, NULL, &status); 354 &demangled);
358 #endif
359 if (status != 0) { 355 if (status != 0) {
360 cu_context_->reporter->DemangleError(data, status); 356 if (status != Language::kDontDemangle) {
Ted Mielczarek 2016/09/14 10:20:10 It's unfortunate that we lose the language context
Mark Mentovai 2016/09/21 17:56:55 Ted Mielczarek wrote:
361 demangled_name_ = ""; 357 cu_context_->reporter->DemangleError(data, status);
362 break; 358 }
363 } 359 demangled_name_.clear();
364 if (demangled) { 360 } else {
365 demangled_name_ = AddStringToPool(demangled); 361 demangled_name_ = AddStringToPool(demangled);
366 free(reinterpret_cast<void*>(demangled));
367 } 362 }
368 break; 363 break;
369 } 364 }
370 default: break; 365 default: break;
371 } 366 }
372 } 367 }
373 368
374 string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { 369 string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() {
375 // Use the demangled name, if one is available. Demangled names are 370 // Use the demangled name, if one is available. Demangled names are
376 // preferable to those inferred from the DWARF structure because they 371 // preferable to those inferred from the DWARF structure because they
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler( 749 dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler(
755 uint64 offset, 750 uint64 offset,
756 enum DwarfTag tag) { 751 enum DwarfTag tag) {
757 switch (tag) { 752 switch (tag) {
758 case dwarf2reader::DW_TAG_subprogram: 753 case dwarf2reader::DW_TAG_subprogram:
759 return new FuncHandler(cu_context_.get(), child_context_.get(), offset); 754 return new FuncHandler(cu_context_.get(), child_context_.get(), offset);
760 case dwarf2reader::DW_TAG_namespace: 755 case dwarf2reader::DW_TAG_namespace:
761 case dwarf2reader::DW_TAG_class_type: 756 case dwarf2reader::DW_TAG_class_type:
762 case dwarf2reader::DW_TAG_structure_type: 757 case dwarf2reader::DW_TAG_structure_type:
763 case dwarf2reader::DW_TAG_union_type: 758 case dwarf2reader::DW_TAG_union_type:
759 case dwarf2reader::DW_TAG_module:
764 return new NamedScopeHandler(cu_context_.get(), child_context_.get(), 760 return new NamedScopeHandler(cu_context_.get(), child_context_.get(),
765 offset); 761 offset);
766 default: 762 default:
767 return NULL; 763 return NULL;
768 } 764 }
769 } 765 }
770 766
771 void DwarfCUToModule::SetLanguage(DwarfLanguage language) { 767 void DwarfCUToModule::SetLanguage(DwarfLanguage language) {
772 switch (language) { 768 switch (language) {
773 case dwarf2reader::DW_LANG_Java: 769 case dwarf2reader::DW_LANG_Java:
774 cu_context_->language = Language::Java; 770 cu_context_->language = Language::Java;
775 break; 771 break;
776 772
773 case dwarf2reader::DW_LANG_Swift:
774 cu_context_->language = Language::Swift;
775 break;
776
777 // DWARF has no generic language code for assembly language; this is 777 // DWARF has no generic language code for assembly language; this is
778 // what the GNU toolchain uses. 778 // what the GNU toolchain uses.
779 case dwarf2reader::DW_LANG_Mips_Assembler: 779 case dwarf2reader::DW_LANG_Mips_Assembler:
780 cu_context_->language = Language::Assembler; 780 cu_context_->language = Language::Assembler;
781 break; 781 break;
782 782
783 // C++ covers so many cases that it probably has some way to cope 783 // 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 784 // with whatever the other languages throw at us. So make it the
785 // default. 785 // default.
786 // 786 //
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 return dwarf_version >= 2; 1066 return dwarf_version >= 2;
1067 } 1067 }
1068 1068
1069 bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) { 1069 bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) {
1070 // We don't deal with partial compilation units (the only other tag 1070 // We don't deal with partial compilation units (the only other tag
1071 // likely to be used for root DIE). 1071 // likely to be used for root DIE).
1072 return tag == dwarf2reader::DW_TAG_compile_unit; 1072 return tag == dwarf2reader::DW_TAG_compile_unit;
1073 } 1073 }
1074 1074
1075 } // namespace google_breakpad 1075 } // namespace google_breakpad
OLDNEW
« no previous file with comments | « src/common/dwarf/dwarf2enums.h ('k') | src/common/language.h » ('j') | src/common/language.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698