michael@0: // -*- mode: c++ -*- michael@0: michael@0: // Copyright (c) 2010 Google Inc. michael@0: // All rights reserved. michael@0: // michael@0: // Redistribution and use in source and binary forms, with or without michael@0: // modification, are permitted provided that the following conditions are michael@0: // met: michael@0: // michael@0: // * Redistributions of source code must retain the above copyright michael@0: // notice, this list of conditions and the following disclaimer. michael@0: // * Redistributions in binary form must reproduce the above michael@0: // copyright notice, this list of conditions and the following disclaimer michael@0: // in the documentation and/or other materials provided with the michael@0: // distribution. michael@0: // * Neither the name of Google Inc. nor the names of its michael@0: // contributors may be used to endorse or promote products derived from michael@0: // this software without specific prior written permission. michael@0: // michael@0: // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS michael@0: // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT michael@0: // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR michael@0: // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT michael@0: // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, michael@0: // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT michael@0: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, michael@0: // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY michael@0: // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT michael@0: // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE michael@0: // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: michael@0: // Original author: Jim Blandy michael@0: michael@0: // language.h: Define google_breakpad::Language. Instances of michael@0: // subclasses of this class provide language-appropriate operations michael@0: // for the Breakpad symbol dumper. michael@0: michael@0: #ifndef COMMON_LINUX_LANGUAGE_H__ michael@0: #define COMMON_LINUX_LANGUAGE_H__ michael@0: michael@0: #include michael@0: michael@0: #include "common/using_std_string.h" michael@0: michael@0: namespace google_breakpad { michael@0: michael@0: // An abstract base class for language-specific operations. We choose michael@0: // an instance of a subclass of this when we find the CU's language. michael@0: // This class's definitions are appropriate for CUs with no specified michael@0: // language. michael@0: class Language { michael@0: public: michael@0: // A base class destructor should be either public and virtual, michael@0: // or protected and nonvirtual. michael@0: virtual ~Language() {} michael@0: michael@0: // Return true if this language has functions to which we can assign michael@0: // line numbers. (Debugging info for assembly language, for example, michael@0: // can have source location information, but does not have functions michael@0: // recorded using DW_TAG_subprogram DIEs.) michael@0: virtual bool HasFunctions() const { return true; } michael@0: michael@0: // Construct a fully-qualified, language-appropriate form of NAME, michael@0: // given that PARENT_NAME is the name of the construct enclosing michael@0: // NAME. If PARENT_NAME is the empty string, then NAME is a michael@0: // top-level name. michael@0: // michael@0: // This API sort of assumes that a fully-qualified name is always michael@0: // some simple textual composition of the unqualified name and its michael@0: // parent's name, and that we don't need to know anything else about michael@0: // the parent or the child (say, their DIEs' tags) to do the job. michael@0: // This is true for the languages we support at the moment, and michael@0: // keeps things concrete. Perhaps a more refined operation would michael@0: // take into account the parent and child DIE types, allow languages michael@0: // to use their own data type for complex parent names, etc. But if michael@0: // C++ doesn't need all that, who would? michael@0: virtual string MakeQualifiedName (const string &parent_name, michael@0: const string &name) const = 0; michael@0: michael@0: // Instances for specific languages. michael@0: static const Language * const CPlusPlus, michael@0: * const Java, michael@0: * const Assembler; michael@0: }; michael@0: michael@0: } // namespace google_breakpad michael@0: michael@0: #endif // COMMON_LINUX_LANGUAGE_H__