/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 vi:set tabstop=4 expandtab: -*/ //===-- RemoteUnwindProfile.h -----------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef __UNWIND_PROFILE_H__ #define __UNWIND_PROFILE_H__ #if defined (SUPPORT_REMOTE_UNWINDING) #include // The architecture-independent profile of a function's prologue namespace lldb_private { class RemoteUnwindProfile { public: RemoteUnwindProfile () : fRegistersSaved(32, 0), fRegSizes(10, 0) { } struct CFALocation { int regno; int offset; }; enum RegisterSavedWhere { kRegisterOffsetFromCFA, kRegisterIsCFA }; enum RegisterType { kGeneralPurposeRegister = 0, kFloatingPointRegister, kVectorRegister }; struct SavedReg { int regno; RegisterSavedWhere location; int64_t value; int adj; // Used in kRegisterInRegister e.g. when we recover the caller's rsp by // taking the contents of rbp and subtracting 16. RegisterType type; }; // In the following maps the key is the address after which this change has effect. // // 0 push %rbp // 1 mov %rsp, %rbp // 2 sub $16, %rsp // // At saved_registers<2> we'll find the record stating that rsp is now stored in rbp. std::map cfa; std::map > saved_registers; struct CFALocation initial_cfa; // At entry to the function std::vector fRegistersSaved; std::vector fRegSizes; SavedReg returnAddress; uint64_t fStart, fEnd; // low and high pc values for this function. // END is the addr of the first insn outside the function. uint64_t fFirstInsnPastPrologue; }; class RemoteProcInfo; bool AssemblyParse (RemoteProcInfo *procinfo, unw_accessors_t *accessor, unw_addr_space_t as, uint64_t start, uint64_t end, RemoteUnwindProfile &profile, void *arg); class FuncBounds { public: FuncBounds (uint64_t low, uint64_t high) : fStart(low), fEnd(high) { } uint64_t fStart; uint64_t fEnd; }; inline bool operator<(const FuncBounds &ap1, const FuncBounds &ap2) { if (ap1.fStart < ap2.fStart) return true; if (ap1.fStart == ap2.fStart && ap1.fEnd < ap2.fEnd) return true; return false; } }; #endif #endif // __UNWIND_PROFILE_H__