1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC 2*9712c20fSFrederick Mayle // 3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without 4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are 5*9712c20fSFrederick Mayle // met: 6*9712c20fSFrederick Mayle // 7*9712c20fSFrederick Mayle // * Redistributions of source code must retain the above copyright 8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer. 9*9712c20fSFrederick Mayle // * Redistributions in binary form must reproduce the above 10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer 11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the 12*9712c20fSFrederick Mayle // distribution. 13*9712c20fSFrederick Mayle // * Neither the name of Google LLC nor the names of its 14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from 15*9712c20fSFrederick Mayle // this software without specific prior written permission. 16*9712c20fSFrederick Mayle // 17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*9712c20fSFrederick Mayle 29*9712c20fSFrederick Mayle 30*9712c20fSFrederick Mayle // This file contains the definitions for a DWARF2/3 information 31*9712c20fSFrederick Mayle // collector that uses the DWARF2/3 reader interface to build a mapping 32*9712c20fSFrederick Mayle // of addresses to files, lines, and functions. 33*9712c20fSFrederick Mayle 34*9712c20fSFrederick Mayle #ifndef COMMON_DWARF_FUNCTIONINFO_H__ 35*9712c20fSFrederick Mayle #define COMMON_DWARF_FUNCTIONINFO_H__ 36*9712c20fSFrederick Mayle 37*9712c20fSFrederick Mayle #include <map> 38*9712c20fSFrederick Mayle #include <string> 39*9712c20fSFrederick Mayle #include <utility> 40*9712c20fSFrederick Mayle #include <vector> 41*9712c20fSFrederick Mayle 42*9712c20fSFrederick Mayle #include "common/dwarf/dwarf2reader.h" 43*9712c20fSFrederick Mayle #include "common/using_std_string.h" 44*9712c20fSFrederick Mayle 45*9712c20fSFrederick Mayle 46*9712c20fSFrederick Mayle namespace google_breakpad { 47*9712c20fSFrederick Mayle 48*9712c20fSFrederick Mayle struct FunctionInfo { 49*9712c20fSFrederick Mayle // Name of the function 50*9712c20fSFrederick Mayle string name; 51*9712c20fSFrederick Mayle // Mangled name of the function 52*9712c20fSFrederick Mayle string mangled_name; 53*9712c20fSFrederick Mayle // File containing this function 54*9712c20fSFrederick Mayle string file; 55*9712c20fSFrederick Mayle // Line number for start of function. 56*9712c20fSFrederick Mayle uint32_t line; 57*9712c20fSFrederick Mayle // Beginning address for this function 58*9712c20fSFrederick Mayle uint64_t lowpc; 59*9712c20fSFrederick Mayle // End address for this function. 60*9712c20fSFrederick Mayle uint64_t highpc; 61*9712c20fSFrederick Mayle // Ranges offset 62*9712c20fSFrederick Mayle uint64_t ranges; 63*9712c20fSFrederick Mayle }; 64*9712c20fSFrederick Mayle 65*9712c20fSFrederick Mayle struct SourceFileInfo { 66*9712c20fSFrederick Mayle // Name of the source file name 67*9712c20fSFrederick Mayle string name; 68*9712c20fSFrederick Mayle // Low address of source file name 69*9712c20fSFrederick Mayle uint64_t lowpc; 70*9712c20fSFrederick Mayle }; 71*9712c20fSFrederick Mayle 72*9712c20fSFrederick Mayle typedef std::map<uint64, FunctionInfo*> FunctionMap; 73*9712c20fSFrederick Mayle typedef std::map<uint64, std::pair<string, uint32> > LineMap; 74*9712c20fSFrederick Mayle 75*9712c20fSFrederick Mayle // This class is a basic line info handler that fills in the dirs, 76*9712c20fSFrederick Mayle // file, and linemap passed into it with the data produced from the 77*9712c20fSFrederick Mayle // LineInfoHandler. 78*9712c20fSFrederick Mayle class CULineInfoHandler: public LineInfoHandler { 79*9712c20fSFrederick Mayle public: 80*9712c20fSFrederick Mayle 81*9712c20fSFrederick Mayle // 82*9712c20fSFrederick Mayle CULineInfoHandler(std::vector<SourceFileInfo>* files, 83*9712c20fSFrederick Mayle std::vector<string>* dirs, 84*9712c20fSFrederick Mayle LineMap* linemap); ~CULineInfoHandler()85*9712c20fSFrederick Mayle virtual ~CULineInfoHandler() { } 86*9712c20fSFrederick Mayle 87*9712c20fSFrederick Mayle // Called when we define a directory. We just place NAME into dirs_ 88*9712c20fSFrederick Mayle // at position DIR_NUM. 89*9712c20fSFrederick Mayle virtual void DefineDir(const string& name, uint32_t dir_num); 90*9712c20fSFrederick Mayle 91*9712c20fSFrederick Mayle // Called when we define a filename. We just place 92*9712c20fSFrederick Mayle // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM. 93*9712c20fSFrederick Mayle virtual void DefineFile(const string& name, int32 file_num, 94*9712c20fSFrederick Mayle uint32_t dir_num, uint64_t mod_time, uint64_t length); 95*9712c20fSFrederick Mayle 96*9712c20fSFrederick Mayle 97*9712c20fSFrederick Mayle // Called when the line info reader has a new line, address pair 98*9712c20fSFrederick Mayle // ready for us. ADDRESS is the address of the code, LENGTH is the 99*9712c20fSFrederick Mayle // length of its machine code in bytes, FILE_NUM is the file number 100*9712c20fSFrederick Mayle // containing the code, LINE_NUM is the line number in that file for 101*9712c20fSFrederick Mayle // the code, and COLUMN_NUM is the column number the code starts at, 102*9712c20fSFrederick Mayle // if we know it (0 otherwise). 103*9712c20fSFrederick Mayle virtual void AddLine(uint64_t address, uint64_t length, 104*9712c20fSFrederick Mayle uint32_t file_num, uint32_t line_num, 105*9712c20fSFrederick Mayle uint32_t column_num); 106*9712c20fSFrederick Mayle 107*9712c20fSFrederick Mayle private: 108*9712c20fSFrederick Mayle LineMap* linemap_; 109*9712c20fSFrederick Mayle std::vector<SourceFileInfo>* files_; 110*9712c20fSFrederick Mayle std::vector<string>* dirs_; 111*9712c20fSFrederick Mayle }; 112*9712c20fSFrederick Mayle 113*9712c20fSFrederick Mayle class CUFunctionInfoHandler: public Dwarf2Handler { 114*9712c20fSFrederick Mayle public: CUFunctionInfoHandler(std::vector<SourceFileInfo> * files,std::vector<string> * dirs,LineMap * linemap,FunctionMap * offset_to_funcinfo,FunctionMap * address_to_funcinfo,CULineInfoHandler * linehandler,const SectionMap & sections,ByteReader * reader)115*9712c20fSFrederick Mayle CUFunctionInfoHandler(std::vector<SourceFileInfo>* files, 116*9712c20fSFrederick Mayle std::vector<string>* dirs, 117*9712c20fSFrederick Mayle LineMap* linemap, 118*9712c20fSFrederick Mayle FunctionMap* offset_to_funcinfo, 119*9712c20fSFrederick Mayle FunctionMap* address_to_funcinfo, 120*9712c20fSFrederick Mayle CULineInfoHandler* linehandler, 121*9712c20fSFrederick Mayle const SectionMap& sections, 122*9712c20fSFrederick Mayle ByteReader* reader) 123*9712c20fSFrederick Mayle : files_(files), dirs_(dirs), linemap_(linemap), 124*9712c20fSFrederick Mayle offset_to_funcinfo_(offset_to_funcinfo), 125*9712c20fSFrederick Mayle address_to_funcinfo_(address_to_funcinfo), 126*9712c20fSFrederick Mayle linehandler_(linehandler), sections_(sections), 127*9712c20fSFrederick Mayle reader_(reader), current_function_info_(NULL) { } 128*9712c20fSFrederick Mayle ~CUFunctionInfoHandler()129*9712c20fSFrederick Mayle virtual ~CUFunctionInfoHandler() { } 130*9712c20fSFrederick Mayle 131*9712c20fSFrederick Mayle // Start to process a compilation unit at OFFSET from the beginning of the 132*9712c20fSFrederick Mayle // .debug_info section. We want to see all compilation units, so we 133*9712c20fSFrederick Mayle // always return true. 134*9712c20fSFrederick Mayle 135*9712c20fSFrederick Mayle virtual bool StartCompilationUnit(uint64_t offset, uint8_t address_size, 136*9712c20fSFrederick Mayle uint8_t offset_size, uint64_t cu_length, 137*9712c20fSFrederick Mayle uint8_t dwarf_version); 138*9712c20fSFrederick Mayle 139*9712c20fSFrederick Mayle // Start to process a DIE at OFFSET from the beginning of the 140*9712c20fSFrederick Mayle // .debug_info section. We only care about function related DIE's. 141*9712c20fSFrederick Mayle virtual bool StartDIE(uint64_t offset, enum DwarfTag tag); 142*9712c20fSFrederick Mayle 143*9712c20fSFrederick Mayle // Called when we have an attribute with unsigned data to give to 144*9712c20fSFrederick Mayle // our handler. The attribute is for the DIE at OFFSET from the 145*9712c20fSFrederick Mayle // beginning of the .debug_info section, has a name of ATTR, a form of 146*9712c20fSFrederick Mayle // FORM, and the actual data of the attribute is in DATA. 147*9712c20fSFrederick Mayle virtual void ProcessAttributeUnsigned(uint64_t offset, 148*9712c20fSFrederick Mayle enum DwarfAttribute attr, 149*9712c20fSFrederick Mayle enum DwarfForm form, 150*9712c20fSFrederick Mayle uint64_t data); 151*9712c20fSFrederick Mayle 152*9712c20fSFrederick Mayle // Called when we have an attribute with a DIE reference to give to 153*9712c20fSFrederick Mayle // our handler. The attribute is for the DIE at OFFSET from the 154*9712c20fSFrederick Mayle // beginning of the .debug_info section, has a name of ATTR, a form of 155*9712c20fSFrederick Mayle // FORM, and the offset of the referenced DIE from the start of the 156*9712c20fSFrederick Mayle // .debug_info section is in DATA. 157*9712c20fSFrederick Mayle virtual void ProcessAttributeReference(uint64_t offset, 158*9712c20fSFrederick Mayle enum DwarfAttribute attr, 159*9712c20fSFrederick Mayle enum DwarfForm form, 160*9712c20fSFrederick Mayle uint64_t data); 161*9712c20fSFrederick Mayle 162*9712c20fSFrederick Mayle // Called when we have an attribute with string data to give to 163*9712c20fSFrederick Mayle // our handler. The attribute is for the DIE at OFFSET from the 164*9712c20fSFrederick Mayle // beginning of the .debug_info section, has a name of ATTR, a form of 165*9712c20fSFrederick Mayle // FORM, and the actual data of the attribute is in DATA. 166*9712c20fSFrederick Mayle virtual void ProcessAttributeString(uint64_t offset, 167*9712c20fSFrederick Mayle enum DwarfAttribute attr, 168*9712c20fSFrederick Mayle enum DwarfForm form, 169*9712c20fSFrederick Mayle const string& data); 170*9712c20fSFrederick Mayle 171*9712c20fSFrederick Mayle // Called when finished processing the DIE at OFFSET. 172*9712c20fSFrederick Mayle // Because DWARF2/3 specifies a tree of DIEs, you may get starts 173*9712c20fSFrederick Mayle // before ends of the previous DIE, as we process children before 174*9712c20fSFrederick Mayle // ending the parent. 175*9712c20fSFrederick Mayle virtual void EndDIE(uint64_t offset); 176*9712c20fSFrederick Mayle 177*9712c20fSFrederick Mayle private: 178*9712c20fSFrederick Mayle std::vector<SourceFileInfo>* files_; 179*9712c20fSFrederick Mayle std::vector<string>* dirs_; 180*9712c20fSFrederick Mayle LineMap* linemap_; 181*9712c20fSFrederick Mayle FunctionMap* offset_to_funcinfo_; 182*9712c20fSFrederick Mayle FunctionMap* address_to_funcinfo_; 183*9712c20fSFrederick Mayle CULineInfoHandler* linehandler_; 184*9712c20fSFrederick Mayle const SectionMap& sections_; 185*9712c20fSFrederick Mayle ByteReader* reader_; 186*9712c20fSFrederick Mayle FunctionInfo* current_function_info_; 187*9712c20fSFrederick Mayle uint64_t current_compilation_unit_offset_; 188*9712c20fSFrederick Mayle }; 189*9712c20fSFrederick Mayle 190*9712c20fSFrederick Mayle } // namespace google_breakpad 191*9712c20fSFrederick Mayle #endif // COMMON_DWARF_FUNCTIONINFO_H__ 192