Index: experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler.h |
diff --git a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler.h b/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler.h |
deleted file mode 100644 |
index 4c9d7536a856da268201e322cc030bf74d78dd68..0000000000000000000000000000000000000000 |
--- a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/dwarf2diehandler.h |
+++ /dev/null |
@@ -1,358 +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. |
- |
-// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> |
- |
-// dwarf2reader::CompilationUnit is a simple and direct parser for |
-// DWARF data, but its handler interface is not convenient to use. In |
-// particular: |
-// |
-// - CompilationUnit calls Dwarf2Handler's member functions to report |
-// every attribute's value, regardless of what sort of DIE it is. |
-// As a result, the ProcessAttributeX functions end up looking like |
-// this: |
-// |
-// switch (parent_die_tag) { |
-// case DW_TAG_x: |
-// switch (attribute_name) { |
-// case DW_AT_y: |
-// handle attribute y of DIE type x |
-// ... |
-// } break; |
-// ... |
-// } |
-// |
-// In C++ it's much nicer to use virtual function dispatch to find |
-// the right code for a given case than to switch on the DIE tag |
-// like this. |
-// |
-// - Processing different kinds of DIEs requires different sets of |
-// data: lexical block DIEs have start and end addresses, but struct |
-// type DIEs don't. It would be nice to be able to have separate |
-// handler classes for separate kinds of DIEs, each with the members |
-// appropriate to its role, instead of having one handler class that |
-// needs to hold data for every DIE type. |
-// |
-// - There should be a separate instance of the appropriate handler |
-// class for each DIE, instead of a single object with tables |
-// tracking all the dies in the compilation unit. |
-// |
-// - It's not convenient to take some action after all a DIE's |
-// attributes have been seen, but before visiting any of its |
-// children. The only indication you have that a DIE's attribute |
-// list is complete is that you get either a StartDIE or an EndDIE |
-// call. |
-// |
-// - It's not convenient to make use of the tree structure of the |
-// DIEs. Skipping all the children of a given die requires |
-// maintaining state and returning false from StartDIE until we get |
-// an EndDIE call with the appropriate offset. |
-// |
-// This interface tries to take care of all that. (You're shocked, I'm sure.) |
-// |
-// Using the classes here, you provide an initial handler for the root |
-// DIE of the compilation unit. Each handler receives its DIE's |
-// attributes, and provides fresh handler objects for children of |
-// interest, if any. The three classes are: |
-// |
-// - DIEHandler: the base class for your DIE-type-specific handler |
-// classes. |
-// |
-// - RootDIEHandler: derived from DIEHandler, the base class for your |
-// root DIE handler class. |
-// |
-// - DIEDispatcher: derived from Dwarf2Handler, an instance of this |
-// invokes your DIE-type-specific handler objects. |
-// |
-// In detail: |
-// |
-// - Define handler classes specialized for the DIE types you're |
-// interested in. These handler classes must inherit from |
-// DIEHandler. Thus: |
-// |
-// class My_DW_TAG_X_Handler: public DIEHandler { ... }; |
-// class My_DW_TAG_Y_Handler: public DIEHandler { ... }; |
-// |
-// DIEHandler subclasses needn't correspond exactly to single DIE |
-// types, as shown here; the point is that you can have several |
-// different classes appropriate to different kinds of DIEs. |
-// |
-// - In particular, define a handler class for the compilation |
-// unit's root DIE, that inherits from RootDIEHandler: |
-// |
-// class My_DW_TAG_compile_unit_Handler: public RootDIEHandler { ... }; |
-// |
-// RootDIEHandler inherits from DIEHandler, adding a few additional |
-// member functions for examining the compilation unit as a whole, |
-// and other quirks of rootness. |
-// |
-// - Then, create a DIEDispatcher instance, passing it an instance of |
-// your root DIE handler class, and use that DIEDispatcher as the |
-// dwarf2reader::CompilationUnit's handler: |
-// |
-// My_DW_TAG_compile_unit_Handler root_die_handler(...); |
-// DIEDispatcher die_dispatcher(&root_die_handler); |
-// CompilationUnit reader(sections, offset, bytereader, &die_dispatcher); |
-// |
-// Here, 'die_dispatcher' acts as a shim between 'reader' and the |
-// various DIE-specific handlers you have defined. |
-// |
-// - When you call reader.Start(), die_dispatcher behaves as follows, |
-// starting with your root die handler and the compilation unit's |
-// root DIE: |
-// |
-// - It calls the handler's ProcessAttributeX member functions for |
-// each of the DIE's attributes. |
-// |
-// - It calls the handler's EndAttributes member function. This |
-// should return true if any of the DIE's children should be |
-// visited, in which case: |
-// |
-// - For each of the DIE's children, die_dispatcher calls the |
-// DIE's handler's FindChildHandler member function. If that |
-// returns a pointer to a DIEHandler instance, then |
-// die_dispatcher uses that handler to process the child, using |
-// this procedure recursively. Alternatively, if |
-// FindChildHandler returns NULL, die_dispatcher ignores that |
-// child and its descendants. |
-// |
-// - When die_dispatcher has finished processing all the DIE's |
-// children, it invokes the handler's Finish() member function, |
-// and destroys the handler. (As a special case, it doesn't |
-// destroy the root DIE handler.) |
-// |
-// This allows the code for handling a particular kind of DIE to be |
-// gathered together in a single class, makes it easy to skip all the |
-// children or individual children of a particular DIE, and provides |
-// appropriate parental context for each die. |
- |
-#ifndef COMMON_DWARF_DWARF2DIEHANDLER_H__ |
-#define COMMON_DWARF_DWARF2DIEHANDLER_H__ |
- |
-#include <stack> |
- |
-#include "common/dwarf/types.h" |
-#include "common/dwarf/dwarf2enums.h" |
-#include "common/dwarf/dwarf2reader.h" |
- |
-namespace dwarf2reader { |
- |
-// A base class for handlers for specific DIE types. The series of |
-// calls made on a DIE handler is as follows: |
-// |
-// - for each attribute of the DIE: |
-// - ProcessAttributeX() |
-// - EndAttributes() |
-// - if that returned true, then for each child: |
-// - FindChildHandler() |
-// - if that returns a non-NULL pointer to a new handler: |
-// - recurse, with the new handler and the child die |
-// - Finish() |
-// - destruction |
-class DIEHandler { |
- public: |
- DIEHandler() { } |
- virtual ~DIEHandler() { } |
- |
- // When we visit a DIE, we first use these member functions to |
- // report the DIE's attributes and their values. These have the |
- // same restrictions as the corresponding member functions of |
- // dwarf2reader::Dwarf2Handler. |
- // |
- // Since DWARF does not specify in what order attributes must |
- // appear, avoid making decisions in these functions that would be |
- // affected by the presence of other attributes. The EndAttributes |
- // function is a more appropriate place for such work, as all the |
- // DIE's attributes have been seen at that point. |
- // |
- // The default definitions ignore the values they are passed. |
- virtual void ProcessAttributeUnsigned(enum DwarfAttribute attr, |
- enum DwarfForm form, |
- uint64 data) { } |
- virtual void ProcessAttributeSigned(enum DwarfAttribute attr, |
- enum DwarfForm form, |
- int64 data) { } |
- virtual void ProcessAttributeReference(enum DwarfAttribute attr, |
- enum DwarfForm form, |
- uint64 data) { } |
- virtual void ProcessAttributeBuffer(enum DwarfAttribute attr, |
- enum DwarfForm form, |
- const char* data, |
- uint64 len) { } |
- virtual void ProcessAttributeString(enum DwarfAttribute attr, |
- enum DwarfForm form, |
- const string& data) { } |
- |
- // Once we have reported all the DIE's attributes' values, we call |
- // this member function. If it returns false, we skip all the DIE's |
- // children. If it returns true, we call FindChildHandler on each |
- // child. If that returns a handler object, we use that to visit |
- // the child; otherwise, we skip the child. |
- // |
- // This is a good place to make decisions that depend on more than |
- // one attribute. DWARF does not specify in what order attributes |
- // must appear, so only when the EndAttributes function is called |
- // does the handler have a complete picture of the DIE's attributes. |
- // |
- // The default definition elects to ignore the DIE's children. |
- // You'll need to override this if you override FindChildHandler, |
- // but at least the default behavior isn't to pass the children to |
- // FindChildHandler, which then ignores them all. |
- virtual bool EndAttributes() { return false; } |
- |
- // If EndAttributes returns true to indicate that some of the DIE's |
- // children might be of interest, then we apply this function to |
- // each of the DIE's children. If it returns a handler object, then |
- // we use that to visit the child DIE. If it returns NULL, we skip |
- // that child DIE (and all its descendants). |
- // |
- // OFFSET is the offset of the child; TAG indicates what kind of DIE |
- // it is; and ATTRS is the list of attributes the DIE will have, and |
- // their forms (their values are not provided). |
- // |
- // The default definition skips all children. |
- virtual DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag, |
- const AttributeList &attrs) { |
- return NULL; |
- } |
- |
- // When we are done processing a DIE, we call this member function. |
- // This happens after the EndAttributes call, all FindChildHandler |
- // calls (if any), and all operations on the children themselves (if |
- // any). We call Finish on every handler --- even if EndAttributes |
- // returns false. |
- virtual void Finish() { }; |
-}; |
- |
-// A subclass of DIEHandler, with additional kludges for handling the |
-// compilation unit's root die. |
-class RootDIEHandler: public DIEHandler { |
- public: |
- RootDIEHandler() { } |
- virtual ~RootDIEHandler() { } |
- |
- // We pass the values reported via Dwarf2Handler::StartCompilationUnit |
- // to this member function, and skip the entire compilation unit if it |
- // returns false. So the root DIE handler is actually also |
- // responsible for handling the compilation unit metadata. |
- // The default definition always visits the compilation unit. |
- virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, |
- uint8 offset_size, uint64 cu_length, |
- uint8 dwarf_version) { return true; } |
- |
- // For the root DIE handler only, we pass the offset, tag and |
- // attributes of the compilation unit's root DIE. This is the only |
- // way the root DIE handler can find the root DIE's tag. If this |
- // function returns true, we will visit the root DIE using the usual |
- // DIEHandler methods; otherwise, we skip the entire compilation |
- // unit. |
- // |
- // The default definition elects to visit the root DIE. |
- virtual bool StartRootDIE(uint64 offset, enum DwarfTag tag, |
- const AttributeList& attrs) { return true; } |
-}; |
- |
-class DIEDispatcher: public Dwarf2Handler { |
- public: |
- // Create a Dwarf2Handler which uses ROOT_HANDLER as the handler for |
- // the compilation unit's root die, as described for the DIEHandler |
- // class. |
- DIEDispatcher(RootDIEHandler *root_handler) : root_handler_(root_handler) { } |
- // Destroying a DIEDispatcher destroys all active handler objects |
- // except the root handler. |
- ~DIEDispatcher(); |
- bool StartCompilationUnit(uint64 offset, uint8 address_size, |
- uint8 offset_size, uint64 cu_length, |
- uint8 dwarf_version); |
- bool StartDIE(uint64 offset, enum DwarfTag tag, |
- const AttributeList &attrs); |
- void ProcessAttributeUnsigned(uint64 offset, |
- enum DwarfAttribute attr, |
- enum DwarfForm form, |
- uint64 data); |
- void ProcessAttributeSigned(uint64 offset, |
- enum DwarfAttribute attr, |
- enum DwarfForm form, |
- int64 data); |
- void ProcessAttributeReference(uint64 offset, |
- enum DwarfAttribute attr, |
- enum DwarfForm form, |
- uint64 data); |
- void ProcessAttributeBuffer(uint64 offset, |
- enum DwarfAttribute attr, |
- enum DwarfForm form, |
- const char* data, |
- uint64 len); |
- void ProcessAttributeString(uint64 offset, |
- enum DwarfAttribute attr, |
- enum DwarfForm form, |
- const string &data); |
- void EndDIE(uint64 offset); |
- |
- private: |
- |
- // The type of a handler stack entry. This includes some fields |
- // which don't really need to be on the stack --- they could just be |
- // single data members of DIEDispatcher --- but putting them here |
- // makes it easier to see that the code is correct. |
- struct HandlerStack { |
- // The offset of the DIE for this handler stack entry. |
- uint64 offset_; |
- |
- // The handler object interested in this DIE's attributes and |
- // children. If NULL, we're not interested in either. |
- DIEHandler *handler_; |
- |
- // Have we reported the end of this DIE's attributes to the handler? |
- bool reported_attributes_end_; |
- }; |
- |
- // Stack of DIE attribute handlers. At StartDIE(D), the top of the |
- // stack is the handler of D's parent, whom we may ask for a handler |
- // for D itself. At EndDIE(D), the top of the stack is D's handler. |
- // Special cases: |
- // |
- // - Before we've seen the compilation unit's root DIE, the stack is |
- // empty; we'll call root_handler_'s special member functions, and |
- // perhaps push root_handler_ on the stack to look at the root's |
- // immediate children. |
- // |
- // - When we decide to ignore a subtree, we only push an entry on |
- // the stack for the root of the tree being ignored, rather than |
- // pushing lots of stack entries with handler_ set to NULL. |
- stack<HandlerStack> die_handlers_; |
- |
- // The root handler. We don't push it on die_handlers_ until we |
- // actually get the StartDIE call for the root. |
- RootDIEHandler *root_handler_; |
-}; |
- |
-} // namespace dwarf2reader |
-#endif // COMMON_DWARF_DWARF2DIEHANDLER_H__ |