| Index: experimental/visual_studio_plugin/src/NaClVsx.Package/DebugSupport/DWARF/DwarfReaderImpl.cs
|
| diff --git a/experimental/visual_studio_plugin/src/NaClVsx.Package/DebugSupport/DWARF/DwarfReaderImpl.cs b/experimental/visual_studio_plugin/src/NaClVsx.Package/DebugSupport/DWARF/DwarfReaderImpl.cs
|
| deleted file mode 100644
|
| index 44f777674d7ac37363a8d052c394874dd0124121..0000000000000000000000000000000000000000
|
| --- a/experimental/visual_studio_plugin/src/NaClVsx.Package/DebugSupport/DWARF/DwarfReaderImpl.cs
|
| +++ /dev/null
|
| @@ -1,292 +0,0 @@
|
| -// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#region
|
| -
|
| -using System;
|
| -using System.Collections.Generic;
|
| -using System.Diagnostics;
|
| -using NaClVsx;
|
| -
|
| -#endregion
|
| -
|
| -namespace Google.NaClVsx.DebugSupport.DWARF {
|
| - /// <summary>
|
| - /// The interface implemented by this class lives in
|
| - /// NaClVsx.DebugHelpers/DwarfParser.h
|
| - /// </summary>
|
| - class DwarfReaderImpl : IDwarfReader {
|
| - public DwarfReaderImpl(SymbolDatabase db) {
|
| - db_ = db;
|
| - }
|
| -
|
| - #region Implementation of IDwarfReader
|
| -
|
| - public void StartCompilationUnit() {
|
| - // File and directory ids are unique only within a compilation unit.
|
| - dirs_.Clear();
|
| - compilationUnitIndex_++;
|
| - }
|
| -
|
| - public void EndCompilationUnit() {}
|
| -
|
| - public void StartDIE(ulong parent, ulong offset, DwarfTag tag) {
|
| - var entry =
|
| - new DebugInfoEntry {
|
| - Key = offset,
|
| - OuterScope = scopeStack_.PeekOrDefault(),
|
| - ParentKey = parent,
|
| - Tag = tag
|
| - };
|
| -
|
| - db_.Entries[offset] = entry;
|
| - }
|
| -
|
| - public void EndDIE(ulong offset) {
|
| - var entry = db_.Entries[offset];
|
| -
|
| - // If this DIE is a scope, it should at this point be at the top of the
|
| - // scope stack.
|
| - if (scopeStack_.PeekOrDefault() == entry) {
|
| - scopeStack_.Pop();
|
| -
|
| - // Add a transition back to the parent scope. This may get overwritten
|
| - // if a sibling scope starts where this one ends, but that's cool.
|
| - //
|
| - // Note: we can only do this if the scope has a high pc value. Labels
|
| - // don't.
|
| - object highpc;
|
| - if (entry.Attributes.TryGetValue(
|
| - DwarfAttribute.DW_AT_high_pc, out highpc)) {
|
| - if (db_.ScopeTransitions.ContainsKey((ulong) highpc)) {
|
| - // This can happen if a parent and child scope end on the same pc
|
| - // value. The parent wins, so overwrite the previous entry.
|
| - db_.ScopeTransitions[(ulong) highpc].Entry = entry.OuterScope;
|
| - } else {
|
| - db_.ScopeTransitions.Add(
|
| - (ulong) highpc,
|
| - new SymbolDatabase.ScopeTransition {
|
| - Address = (ulong) highpc,
|
| - Entry = entry.OuterScope
|
| - });
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - public void ProcessAttribute(ulong offset,
|
| - ulong parent,
|
| - DwarfAttribute attr,
|
| - object data) {
|
| - var entry = db_.Entries[offset];
|
| -
|
| - var key = attributeIndex_++;
|
| - db_.Attributes.Add(
|
| - key,
|
| - new SymbolDatabase.DebugInfoAttribute {
|
| - Key = key,
|
| - ParentKey = parent,
|
| - Tag = attr,
|
| - Value = data
|
| - });
|
| - entry.Attributes.Add(attr, data);
|
| -
|
| -
|
| - // If we have a PC range, it's time to make a new scope
|
| - if (attr == DwarfAttribute.DW_AT_low_pc) {
|
| - var addr = (ulong) data;
|
| -
|
| - // Add a scope transition for this entry.
|
| - // Replace any existing scope transition at the point where
|
| - // this entry starts. Existing transitions are expected--it
|
| - // just means that this entry starts where its sibling ends.
|
| - if (db_.ScopeTransitions.ContainsKey(addr)) {
|
| - db_.ScopeTransitions[addr].Entry = entry;
|
| - } else {
|
| - db_.ScopeTransitions.Add(
|
| - addr,
|
| - new SymbolDatabase.ScopeTransition {
|
| - Address = addr,
|
| - Entry = entry
|
| - });
|
| - }
|
| - // This entry may already be on the scope track if it has low_pc and
|
| - // ranges.
|
| - if (scopeStack_.PeekOrDefault() != entry) {
|
| - scopeStack_.Push(db_.Entries[parent]);
|
| - }
|
| - } else if (attr == DwarfAttribute.DW_AT_ranges) {
|
| - // We can't make the scope transition because ranges are parsed on a
|
| - // different code path, so we'll handle it during a post-processing
|
| - // step.
|
| - // This entry may already be on the scope track if it has low_pc as
|
| - // well as ranges.
|
| - if (scopeStack_.PeekOrDefault() != entry) {
|
| - scopeStack_.Push(db_.Entries[parent]);
|
| - }
|
| - }
|
| - }
|
| -
|
| - public void DefineDir(string name, uint dirNum) {
|
| - try {
|
| - dirs_[dirNum] = name;
|
| - }
|
| - catch (Exception e) {
|
| - Debug.WriteLine(e.Message);
|
| - }
|
| - }
|
| -
|
| - public void DefineFile(string name,
|
| - int fileNum,
|
| - uint dirNum) {
|
| - var key = MakeFileKey((uint) fileNum);
|
| - string relpath;
|
| - if (!dirs_.TryGetValue(dirNum, out relpath)) {
|
| - relpath = "";
|
| - }
|
| - db_.Files.Add(
|
| - key,
|
| - new SymbolDatabase.SourceFile {
|
| - Key = key,
|
| - Filename = name,
|
| - RelativePath = relpath,
|
| - CurrentAbsolutePath = name
|
| - });
|
| - }
|
| -
|
| - public void AddLine(ulong address,
|
| - ulong length,
|
| - uint fileNum,
|
| - uint lineNum,
|
| - uint columnNum) {
|
| - //
|
| - // There are several cases in the C++ standard library where a line entry
|
| - // has zero length. This appears to happen when a line of code is
|
| - // elided for whatever reason. The problem is that the address might be
|
| - // perfectly valid for a different line of code, which would lead to
|
| - // duplicate entries in our location table. So if length is zero, bail.
|
| - //
|
| - if (length == 0) {
|
| - return;
|
| - }
|
| -
|
| - //
|
| - // Add the address and location to our locations table.
|
| - //
|
| - try {
|
| - var
|
| - sourceLocation = new SymbolDatabase.SourceLocation {
|
| - StartAddress = address,
|
| - Length = length,
|
| - SourceFileKey = MakeFileKey(fileNum),
|
| - Line = lineNum,
|
| - Column = columnNum,
|
| - };
|
| -
|
| - db_.Locations.Add(address, sourceLocation);
|
| - }
|
| - catch (Exception e) {
|
| - Debug.WriteLine(e.Message);
|
| - }
|
| - }
|
| -
|
| - public void AddLocListEntry(ulong offset,
|
| - bool isFirstEntry,
|
| - ulong lowPc,
|
| - ulong highPc,
|
| - byte[] data) {
|
| - if (isFirstEntry) {
|
| - currentLocList_ = offset;
|
| - db_.LocLists.Add(offset, new List<SymbolDatabase.LocListEntry>());
|
| - }
|
| - var list = db_.LocLists[currentLocList_];
|
| - list.Add(
|
| - new SymbolDatabase.LocListEntry {
|
| - StartAddress = lowPc,
|
| - EndAddress = highPc,
|
| - Data = data
|
| - });
|
| - }
|
| -
|
| - public bool BeginCfiEntry(ulong address) {
|
| - currentFrame_ = new SymbolDatabase.CallFrame {Address = address};
|
| - return true;
|
| - }
|
| -
|
| - public bool AddCfiRule(ulong address,
|
| - int reg,
|
| - IDwarfReader.CfiRuleType ruleType,
|
| - int baseRegister,
|
| - int offset,
|
| - byte[] expression) {
|
| - currentFrame_.Rules.Add(
|
| - new SymbolDatabase.CallFrame.Rule {
|
| - Address = address,
|
| - BaseRegister = baseRegister,
|
| - Expression = expression,
|
| - Offset = offset,
|
| - RegisterId = reg,
|
| - RuleType = ruleType
|
| - });
|
| - return true;
|
| - }
|
| -
|
| - public bool EndCfiEntry() {
|
| - if (currentFrame_ == null) {
|
| - throw new DwarfParseException("Mismatched begin/end CFI entries");
|
| - }
|
| - db_.CallFrames.Add(currentFrame_.Address, currentFrame_);
|
| -
|
| - currentFrame_ = null;
|
| - return true;
|
| - }
|
| -
|
| - public void AddRangeListEntry(ulong offset,
|
| - ulong baseAddress,
|
| - ulong lowPC,
|
| - ulong highPC) {
|
| - if (lowPC != highPC) {
|
| - if (!db_.RangeLists.ContainsKey(offset)) {
|
| - db_.RangeLists.Add(offset, new Dictionary<ulong, RangeListEntry>());
|
| - }
|
| - if (!db_.RangeLists[offset].ContainsKey(lowPC)) {
|
| - var entry = new RangeListEntry {
|
| - Offset = offset,
|
| - BaseAddress = baseAddress,
|
| - LowPC = lowPC,
|
| - HighPC = highPC
|
| - };
|
| - db_.RangeLists[offset].Add(lowPC, entry);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private ulong MakeFileKey(uint fileNum) {
|
| - return ((ulong) compilationUnitIndex_ << 32) | fileNum;
|
| - }
|
| -
|
| - #endregion
|
| -
|
| - #region Private Implementation
|
| -
|
| - private readonly SymbolDatabase db_;
|
| -
|
| - private readonly Dictionary<uint, string> dirs_ =
|
| - new Dictionary<uint, string>();
|
| -
|
| - private readonly Stack<DebugInfoEntry> scopeStack_ =
|
| - new Stack<DebugInfoEntry>();
|
| -
|
| - private ulong attributeIndex_;
|
| - private ushort compilationUnitIndex_;
|
| - private SymbolDatabase.CallFrame currentFrame_;
|
| - private ulong currentLocList_;
|
| -
|
| - #endregion
|
| - }
|
| -
|
| - internal class DwarfParseException : Exception {
|
| - public DwarfParseException(string msg) : base(msg) {}
|
| - }
|
| -}
|
|
|