| Index: obsolete/gdb-utils/src/dwarf_xml/main.cc
|
| diff --git a/obsolete/gdb-utils/src/dwarf_xml/main.cc b/obsolete/gdb-utils/src/dwarf_xml/main.cc
|
| deleted file mode 100644
|
| index 42e286272a73a7e854b5f83fceb034aecf2c920c..0000000000000000000000000000000000000000
|
| --- a/obsolete/gdb-utils/src/dwarf_xml/main.cc
|
| +++ /dev/null
|
| @@ -1,473 +0,0 @@
|
| -// -*- mode: c++ -*-
|
| -
|
| -// Copyright (c) 2010 Google Inc. All Rights Reserved.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following disclaimer
|
| -// in the documentation and/or other materials provided with the
|
| -// distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived from
|
| -// this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -
|
| -#include <sys/types.h>
|
| -#include <sys/stat.h>
|
| -#include <fcntl.h>
|
| -#include <stdio.h>
|
| -#include <stdlib.h>
|
| -#include <string.h>
|
| -#include <io.h>
|
| -
|
| -#include <algorithm>
|
| -#include <map>
|
| -#include <stack>
|
| -#include <iostream>
|
| -#include <sstream>
|
| -
|
| -#include "common\dwarf\dwarf2enums.h"
|
| -
|
| -#include "elf_reader\elf_object.h"
|
| -#include "dwarf_reader\dwarf_parse.h"
|
| -#include "dwarf_reader\dwarf_reader.h"
|
| -#include "dwarf_reader\dwarf_strings.h"
|
| -#include "dwarf_reader\dwarf_vm.h"
|
| -
|
| -using namespace std;
|
| -using namespace dwarf2reader;
|
| -using namespace dwarf_reader;
|
| -using namespace elf_reader;
|
| -
|
| -void StreamTabs(uint32_t depth) {
|
| - cout.width(0);
|
| -
|
| - for (int64 a = 0; a < depth; a++)
|
| - cout << " ";
|
| -}
|
| -
|
| -void StreamStartTag(const char *name) {
|
| - cout.width(0);
|
| - cout << "<" << name << ">";
|
| -}
|
| -
|
| -void StreamEndTag(const char *name) {
|
| - cout.width(0);
|
| - cout << "</" << name << ">" << endl;
|
| -}
|
| -
|
| -template<typename T>
|
| -void StreamValue(const T& val) {
|
| - cout << val;
|
| -}
|
| -
|
| -void StreamValue(const uint64& val) {
|
| - cout << hex << val << dec;
|
| -}
|
| -
|
| -template<typename T>
|
| -void StreamTag(int tabs, const char* name, const T& val) {
|
| - StreamTabs(tabs);
|
| - StreamStartTag(name);
|
| - StreamValue(val);
|
| - StreamEndTag(name);
|
| -}
|
| -
|
| -template<typename T>
|
| -void StreamTag(const char* name, const T& val, int tabs = 0) {
|
| - StreamTag(0, name, val);
|
| -}
|
| -
|
| -
|
| -class DwarfInfo : public IDwarfReader {
|
| -public:
|
| - void *StartCompilationUnit(uint64 offset, uint8 address_size,
|
| - uint8 offset_size, uint64 cu_length,
|
| - uint8 dwarf_version) {
|
| -
|
| - cout.fill('0');
|
| - cout.setf(std::ios_base::showbase);
|
| -
|
| - StreamStartTag("compile_block");
|
| - cout << endl;
|
| - return (void *) 1;
|
| - }
|
| -
|
| - void EndCompilationUnit(void *ctx, uint64 offset) {
|
| - StreamEndTag("compile_block");
|
| - }
|
| -
|
| - void *StartDIE(void *ctx, uint64 parent, uint64 offset, enum DwarfTag tag) {
|
| - const char *tagName = DwarfTagName(tag);
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(tagName);
|
| - cout << endl;
|
| -
|
| - tags_.push(tagName);
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("ID");
|
| - cout.width(1);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - cout << offset;
|
| - StreamEndTag("ID");
|
| - return (void *) (((int) ctx) + 1);
|
| - }
|
| -
|
| - void EndDIE(void *ctx, uint64 offset) {
|
| - const char *name = tags_.top();
|
| - tags_.pop();
|
| -
|
| - StreamTabs((int) ctx - 1);
|
| - StreamStartTag(name);
|
| - cout << endl;
|
| - }
|
| -
|
| - void ProcessAttributeUnsigned(void *ctx,
|
| - uint64 offset,
|
| - uint64 parent,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - uint64 data) {
|
| - const char *attrName = DwarfAttributeName(attr);
|
| -
|
| - switch(form) {
|
| - case DW_FORM_data8:
|
| - cout.width(16);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - break;
|
| -
|
| - case DW_FORM_data4:
|
| - case DW_FORM_data2:
|
| - cout.width(8);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - break;
|
| -
|
| - case DW_FORM_addr:
|
| - cout.width(1);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - break;
|
| -
|
| - case DW_FORM_data1:
|
| - case DW_FORM_flag:
|
| - cout.width(1);
|
| - cout.setf(ios_base::dec , ios_base::basefield);
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(attrName);
|
| - cout << data;
|
| - StreamEndTag(attrName);
|
| - }
|
| -
|
| - void ProcessAttributeSigned(void *ctx,
|
| - uint64 offset,
|
| - uint64 parent,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - int64 data) {
|
| - const char *attrName = DwarfAttributeName(attr);
|
| - switch(form) {
|
| - case DW_FORM_data4:
|
| - case DW_FORM_data2:
|
| - cout.width(8);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - break;
|
| -
|
| - case DW_FORM_data1:
|
| - case DW_FORM_sdata:
|
| - cout.width(1);
|
| - cout.setf(ios_base::dec , ios_base::basefield);
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(attrName);
|
| - cout << data;
|
| - StreamEndTag(attrName);
|
| - }
|
| -
|
| - void ProcessAttributeReference(void *ctx,
|
| - uint64 offset,
|
| - uint64 parent,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - uint64 data) {
|
| - const char *attrName = DwarfAttributeName(attr);
|
| - switch(form) {
|
| - case DW_FORM_ref_addr:
|
| - case DW_FORM_ref1:
|
| - case DW_FORM_ref2:
|
| - case DW_FORM_ref4:
|
| - case DW_FORM_ref8:
|
| - cout.width(1);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(attrName);
|
| - cout << data;
|
| - StreamEndTag(attrName);
|
| - }
|
| -
|
| - void ProcessAttributeBuffer(void *ctx,
|
| - uint64 offset,
|
| - uint64 parent,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - const char* data,
|
| - uint64 len) {
|
| - const char *attrName = DwarfAttributeName(attr);
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(attrName);
|
| -
|
| - cout.width(0);
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| -
|
| - if (form != DW_FORM_block1) {
|
| - printf("ATTR=%s FORM=%s\n", DwarfAttributeName(attr), DwarfFormName(form));
|
| - cout.unsetf(std::ios_base::showbase);
|
| - cout << "0x";
|
| - for (uint64 a = 0; a < len; a++) {
|
| - uint32 l = ((unsigned char) data[a]) >> 4;
|
| - uint32 r = ((unsigned char) data[a]) & 0xF;
|
| -
|
| - cout << l;
|
| - cout << r;
|
| - }
|
| - }
|
| - else {
|
| - DwarfStaticVM64 vm;
|
| -// vm.Push(0);
|
| -// vm.Run(data, len);
|
| -// int64 addr = *(vm.StackTop());
|
| -
|
| - int64 addr = DwarfParseVM(&vm, (uint8_t *) data, len);
|
| - cout.setf(std::ios_base::showbase);
|
| - if (addr < 0)
|
| - cout.setf(ios_base::dec , ios_base::basefield);
|
| -
|
| - cout << addr;
|
| - }
|
| - cout.setf(std::ios_base::showbase);
|
| - StreamEndTag(attrName);
|
| - }
|
| -
|
| - void ProcessAttributeString(void *ctx,
|
| - uint64 offset,
|
| - uint64 parent,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - const char* data) {
|
| - const char *attrName = DwarfAttributeName(attr);
|
| - switch(form) {
|
| - case DW_FORM_strp:
|
| - case DW_FORM_string:
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag(attrName);
|
| - cout << data;
|
| - StreamEndTag(attrName);
|
| - }
|
| -
|
| - void DefineDir(void *ctx, const char *name, uint32 dir_num) {
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag("dir");
|
| - cout << endl;
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("name");
|
| - cout << name;
|
| - StreamEndTag("name");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("number");
|
| - cout << dir_num;
|
| - StreamEndTag("number");
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamEndTag("dir");
|
| - }
|
| -
|
| - void DefineFile(void *ctx, const char *name, int32 file_num,
|
| - uint32 dir_num, uint64 mod_time, uint64 length) {
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag("file");
|
| - cout << endl;
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("name");
|
| - cout << name;
|
| - StreamEndTag("name");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("number");
|
| - cout << file_num;
|
| - StreamEndTag("number");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("dir");
|
| - cout << dir_num;
|
| - StreamEndTag("dir");
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamEndTag("file");
|
| - }
|
| -
|
| - void AddLine(void *ctx, uint64 address, uint64 length, uint32 file_num,
|
| - uint32 line_num, uint32 column_num) {
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamStartTag("line");
|
| - cout << endl;
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("address");
|
| - cout.setf(ios_base::hex , ios_base::basefield);
|
| - cout << address;
|
| - StreamEndTag("address");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("length");
|
| - cout.setf(ios_base::dec , ios_base::basefield);
|
| - cout << length;
|
| - StreamEndTag("length");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("file");
|
| - cout << file_num;
|
| - StreamEndTag("file");
|
| -
|
| - StreamTabs((int) ctx + 1);
|
| - StreamStartTag("line_number");
|
| - cout << line_num;
|
| - StreamEndTag("line_number");
|
| -
|
| - StreamTabs((int) ctx);
|
| - StreamEndTag("line");
|
| - }
|
| -
|
| - virtual void AddLocListEntry(
|
| - uint64 offset,
|
| - bool is_first_entry,
|
| - uint64 lowPc,
|
| - uint64 highPc,
|
| - const void* data,
|
| - size_t dataSize) {
|
| - // do nothing
|
| - }
|
| -
|
| - virtual bool BeginCfiEntry (
|
| - size_t offset,
|
| - uint64 address,
|
| - uint64 length,
|
| - uint8 version,
|
| - const char* augmentation,
|
| - unsigned return_address){
|
| - StreamStartTag("cfi-entry");
|
| - cout << endl;
|
| - StreamTag(1, "offset", offset);
|
| - StreamTag(1, "address", address);
|
| - StreamTag(1, "version", (uint32)version);
|
| - StreamTag(1, "augmentation", augmentation);
|
| - StreamTag(1, "return-address", return_address);
|
| - StreamTabs(1);
|
| - StreamStartTag("rules");
|
| - cout << endl;
|
| - return true;
|
| - }
|
| -
|
| - virtual bool AddCfiRule(
|
| - uint64 address,
|
| - int reg,
|
| - CFI_RuleType ruleType,
|
| - int base_register,
|
| - int32 offset,
|
| - const void* expression,
|
| - uint32 expressionLength) {
|
| - StreamTabs(2);
|
| - StreamStartTag("cfi-rule");
|
| - cout << endl;
|
| -
|
| - StreamTag(3, "address", address);
|
| - StreamTag(3, "register", reg);
|
| - StreamTag(3, "rule-type", ruleType);
|
| - StreamTag(3, "base-register", base_register);
|
| - StreamTag(3, "offset", offset);
|
| - StreamTag(3, "expression", expression);
|
| -
|
| - StreamTabs(2);
|
| - StreamEndTag("cfi-rule");
|
| - return true;
|
| - }
|
| -
|
| - virtual bool EndCfiEntry() {
|
| - StreamTabs(1);
|
| - StreamEndTag("rules");
|
| - StreamEndTag("cfi-entry");
|
| - return true;
|
| - }
|
| -public:
|
| - stack<const char *> tags_;
|
| -};
|
| -
|
| -
|
| -
|
| -int main(int argc, const char *argv[]) {
|
| - const char *file = "..\\..\\..\\..\\src\\loop\\loop.nexe";
|
| - ElfObject elf;
|
| - DwarfInfo dwarf;
|
| -
|
| - if (argc == 2)
|
| - file = argv[1];
|
| - else {
|
| - printf("Expecting: dwarf_xml <file.nexe>\n");
|
| - return -1;
|
| - }
|
| -
|
| - if (0 == file)
|
| - return -1;
|
| -
|
| - if (elf.Load(file))
|
| - DwarfParseElf(&elf, &dwarf);
|
| - else
|
| - printf("Could not load '%s'\n", file);
|
| -
|
| - return 0;
|
| -}
|
|
|