-/* Copyright (c) 2015. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2015-2017. 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 <cstdint>
#include <cstdlib>
-#include <stdexcept>
+#include <stdexcept> // runtime_error
+#include <utility>
+#include <vector>
+
+#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.
*/
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_];
}