X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/218c42a20c7eaba87e20cfb3eaac5ad8e0d0f739..706dd4584b4002e0d948b81d103dd5c4b70db077:/src/mc/DwarfExpression.cpp diff --git a/src/mc/DwarfExpression.cpp b/src/mc/DwarfExpression.cpp index d2de7fd838..6cdba68ae1 100644 --- a/src/mc/DwarfExpression.cpp +++ b/src/mc/DwarfExpression.cpp @@ -4,27 +4,26 @@ /* 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 #include -#include #include #include -#include "mc_object_info.h" -#include "mc_private.h" -#include "mc/LocationList.hpp" -#include "mc/AddressSpace.hpp" -#include "mc/Frame.hpp" -#include "mc/ObjectInformation.hpp" -#include "mc/DwarfExpression.hpp" -#include "mc_dwarf.hpp" +#include "src/mc/mc_private.h" +#include "src/mc/LocationList.hpp" +#include "src/mc/AddressSpace.hpp" +#include "src/mc/Frame.hpp" +#include "src/mc/ObjectInformation.hpp" +#include "src/mc/DwarfExpression.hpp" +#include "src/mc/mc_dwarf.hpp" using simgrid::mc::remote; namespace simgrid { namespace dwarf { -evaluation_error::~evaluation_error() {} +evaluation_error::~evaluation_error() noexcept(true) {} void execute( const Dwarf_Op* ops, std::size_t n, @@ -70,22 +69,31 @@ void execute( case DW_OP_breg29: case DW_OP_breg30: case DW_OP_breg31:{ + // Push register + constant: int register_id = simgrid::dwarf::dwarf_register_to_libunwind( op->atom - DW_OP_breg0); unw_word_t res; if (!context.cursor) - throw evaluation_error("Missin stack context"); + throw evaluation_error("Missing stack context"); unw_get_reg(context.cursor, register_id, &res); stack.push(res + op->number); break; } - // Push the CFA (Canonical Frame Addresse): + // Push the CFA (Canonical Frame Address): case DW_OP_call_frame_cfa: { - // UNW_X86_64_CFA does not return the CFA DWARF expects - // (it is a synonym for UNW_X86_64_RSP) so copy the cursor, - // unwind it once in order to find the parent SP: + /* See 6.4 of DWARF4 (http://dwarfstd.org/doc/DWARF4.pdf#page=140): + * + * > Typically, the CFA is defined to be the value of the stack + * > pointer at the call site in the previous frame (which may be + * > different from its value on entry to the current frame). + * + * We need to unwind the frame in order to get the SP of the parent + * frame. + * + * Warning: the CFA returned by libunwind (UNW_X86_64_RSP, etc.) + * is the SP of the *current* frame. */ if (!context.cursor) throw evaluation_error("Missint cursor"); @@ -109,7 +117,6 @@ void execute( // ***** Constants: // Short constant literals: - // DW_OP_lit15 pushed the 15 on the stack. case DW_OP_lit0: case DW_OP_lit1: case DW_OP_lit2: @@ -142,6 +149,7 @@ void execute( case DW_OP_lit29: case DW_OP_lit30: case DW_OP_lit31: + // Push a literal/constant on the stack: stack.push(atom - DW_OP_lit0); break; @@ -183,9 +191,8 @@ void execute( stack.pop(); break; - // Swap the two top-most value of the stack: case DW_OP_swap: - std::swap(stack.top(), stack.top(1)); + stack.swap(); break; // Duplicate the value under the top of the stack: