From 86bf665eac22efa78936a3059e7bc90ee10dcf4b Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Wed, 11 Jun 2008 11:08:22 +0200 Subject: PR 2608 plus some refactoring in tapsets.cxx New dwarf_wrappers.h, dwarf_wrappers.cxx for for idiomatic access to libdwarf and refactoring somethings out of the giant classes in tapsets.cxx. --- dwarf_wrappers.h | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 dwarf_wrappers.h (limited to 'dwarf_wrappers.h') diff --git a/dwarf_wrappers.h b/dwarf_wrappers.h new file mode 100644 index 00000000..043c2957 --- /dev/null +++ b/dwarf_wrappers.h @@ -0,0 +1,87 @@ +// -*- C++ -*- +// Copyright (C) 2008 Red Hat Inc. +// +// This file is part of systemtap, and is free software. You can +// redistribute it and/or modify it under the terms of the GNU General +// Public License (GPL); either version 2, or (at your option) any +// later version. + +#ifndef DWARF_WRAPPERS_H +#define DWARF_WRAPPERS_H 1 +#include + +#include + +// NB: "rc == 0" means OK in this case +void dwfl_assert(const std::string& desc, int rc); + +template +void dwfl_assert(const std::string& desc, T* ptr) +{ + if (!ptr) + dwfl_assert(desc, -1); +} + +template +void dwfl_assert(const std::string& desc, const T* ptr) +{ + if (!ptr) + dwfl_assert(desc, -1); +} + +// NB: "rc == 0" means OK in this case +void dwarf_assert(const std::string& desc, int rc); + +template +void dwarf_assert(const std::string& desc, T* ptr) +{ + if (!ptr) + dwarf_assert(desc, -1); +} + + +class dwarf_line_t +{ +public: + const Dwarf_Line* line; + dwarf_line_t() : line(0) {} + dwarf_line_t(const Dwarf_Line* line_) : line(line_) {} + + dwarf_line_t& operator= (const Dwarf_Line* line_) + { + line = (line_); + return *this; + } + + operator bool() const + { + return line != 0; + } + + int lineno() const + { + int lineval; + if (!line) + dwarf_assert("dwarf_line_t::lineno", -1); + dwarf_lineno(const_cast(line), &lineval); + return lineval; + } + Dwarf_Addr addr() const + { + Dwarf_Addr addrval; + if (!line) + dwarf_assert("dwarf_line_t::addr", -1); + dwarf_lineaddr(const_cast(line), &addrval); + return addrval; + } + const char* linesrc(Dwarf_Word* mtime = 0, Dwarf_Word* length = 0) + { + const char* retval = dwarf_linesrc(const_cast(line), mtime, + length); + dwarf_assert("dwarf_line_t::linesrc", retval); + return retval; + } +}; + + +#endif -- cgit