-/* Copyright (c) 2015. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2015-2018. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <elfutils/libdw.h>
#include "src/mc/mc_forward.hpp"
+#include "src/mc/AddressSpace.hpp"
-/** @file DwarfExession.hpp
+/** @file DwarfExpression.hpp
*
- * Evaluation of DWARF location expressions
+ * Evaluation of DWARF location expressions.
*/
namespace simgrid {
/** A DWARF expression
*
* DWARF defines a simple stack-based VM for evaluating expressions
- * (such as locations of variables, etc.): A DWARF expressions is
+ * (such as locations of variables, etc.): a DWARF expression is
* just a sequence of dwarf instructions. We currently directly use
* `Dwarf_Op` from `dwarf.h` for dwarf instructions.
*/
* the process memory, etc. All those informations are gathered in
* the evaluation context.
*/
-struct ExpressionContext {
+class ExpressionContext {
+public:
ExpressionContext() :
cursor(nullptr), frame_base(nullptr), address_space(nullptr),
object_info(nullptr), process_index(simgrid::mc::ProcessIndexMissing) {}
};
/** When an error happens in the execution of a DWARF expression */
-class evaluation_error : std::runtime_error {
+class evaluation_error : public std::runtime_error {
public:
- evaluation_error(const char* what): std::runtime_error(what) {}
- ~evaluation_error() noexcept(true);
+ explicit evaluation_error(const char* what) : std::runtime_error(what) {}
};
/** A stack for evaluating a DWARF expression
typedef std::uintptr_t value_type;
static const std::size_t max_size = 64;
private:
- uintptr_t stack_[max_size];
+ // Values of the stack (the top is stack_[size_ - 1]):
+ uintptr_t stack_[max_size] {0};
size_t size_;
public:
ExpressionStack() : size_(0) {}
void push(value_type value)
{
if (size_ == max_size)
- throw evaluation_error("Dwarf stack overflow");
+ throw evaluation_error("DWARF stack overflow");
stack_[size_++] = value;
}
value_type pop()
{
if (size_ == 0)
- throw evaluation_error("Stack underflow");
+ throw evaluation_error("DWARF stack underflow");
return stack_[--size_];
}