130fdc8d8SChris Lattner //===-- StackID.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/Target/StackID.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // C Includes 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 1659e8fc1cSGreg Clayton #include "lldb/Core/Stream.h" 1759e8fc1cSGreg Clayton #include "lldb/Symbol/Block.h" 1859e8fc1cSGreg Clayton #include "lldb/Symbol/Symbol.h" 1959e8fc1cSGreg Clayton #include "lldb/Symbol/SymbolContext.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb_private; 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner 2459e8fc1cSGreg Clayton void 2559e8fc1cSGreg Clayton StackID::Dump (Stream *s) 2659e8fc1cSGreg Clayton { 27*6dadd508SGreg Clayton s->Printf("StackID (pc = 0x%16.16llx, cfa = 0x%16.16llx, symbol_scope = %p", (uint64_t)m_pc, (uint64_t)m_cfa, m_symbol_scope); 2859e8fc1cSGreg Clayton if (m_symbol_scope) 2959e8fc1cSGreg Clayton { 3059e8fc1cSGreg Clayton SymbolContext sc; 3159e8fc1cSGreg Clayton 3259e8fc1cSGreg Clayton m_symbol_scope->CalculateSymbolContext (&sc); 3359e8fc1cSGreg Clayton if (sc.block) 3459e8fc1cSGreg Clayton s->Printf(" (Block {0x%8.8x})", sc.block->GetID()); 3559e8fc1cSGreg Clayton else if (sc.symbol) 3659e8fc1cSGreg Clayton s->Printf(" (Symbol{0x%8.8x})", sc.symbol->GetID()); 3759e8fc1cSGreg Clayton } 3859e8fc1cSGreg Clayton s->PutCString(") "); 3959e8fc1cSGreg Clayton } 4059e8fc1cSGreg Clayton 4130fdc8d8SChris Lattner bool 4230fdc8d8SChris Lattner lldb_private::operator== (const StackID& lhs, const StackID& rhs) 4330fdc8d8SChris Lattner { 44*6dadd508SGreg Clayton if (lhs.GetCallFrameAddress() != rhs.GetCallFrameAddress()) 45*6dadd508SGreg Clayton return false; 46*6dadd508SGreg Clayton 47*6dadd508SGreg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 48*6dadd508SGreg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 49*6dadd508SGreg Clayton 50*6dadd508SGreg Clayton // Only compare the PC values if both symbol context scopes are NULL 51*6dadd508SGreg Clayton if (lhs_scope == NULL && rhs_scope == NULL) 52*6dadd508SGreg Clayton return lhs.GetPC() == rhs.GetPC(); 53*6dadd508SGreg Clayton 54*6dadd508SGreg Clayton return lhs_scope == rhs_scope; 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner bool 5830fdc8d8SChris Lattner lldb_private::operator!= (const StackID& lhs, const StackID& rhs) 5930fdc8d8SChris Lattner { 60*6dadd508SGreg Clayton if (lhs.GetCallFrameAddress() != rhs.GetCallFrameAddress()) 61*6dadd508SGreg Clayton return true; 62*6dadd508SGreg Clayton 63*6dadd508SGreg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 64*6dadd508SGreg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 65*6dadd508SGreg Clayton 66*6dadd508SGreg Clayton if (lhs_scope == NULL && rhs_scope == NULL) 67*6dadd508SGreg Clayton return lhs.GetPC() != rhs.GetPC(); 68*6dadd508SGreg Clayton 69*6dadd508SGreg Clayton return lhs_scope != rhs_scope; 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner bool 7330fdc8d8SChris Lattner lldb_private::operator< (const StackID& lhs, const StackID& rhs) 7430fdc8d8SChris Lattner { 75*6dadd508SGreg Clayton const lldb::addr_t lhs_cfa = lhs.GetCallFrameAddress(); 76*6dadd508SGreg Clayton const lldb::addr_t rhs_cfa = rhs.GetCallFrameAddress(); 77*6dadd508SGreg Clayton 78*6dadd508SGreg Clayton if (lhs_cfa != rhs_cfa) 79*6dadd508SGreg Clayton return lhs_cfa < rhs_cfa; 80*6dadd508SGreg Clayton 81*6dadd508SGreg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 82*6dadd508SGreg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 83*6dadd508SGreg Clayton 84*6dadd508SGreg Clayton if (lhs_scope != NULL && rhs_scope != NULL) 85*6dadd508SGreg Clayton { 86*6dadd508SGreg Clayton // Same exact scope, lhs is not less than (younger than rhs) 87*6dadd508SGreg Clayton if (lhs_scope == rhs_scope) 88*6dadd508SGreg Clayton return false; 89*6dadd508SGreg Clayton 90*6dadd508SGreg Clayton SymbolContext lhs_sc; 91*6dadd508SGreg Clayton SymbolContext rhs_sc; 92*6dadd508SGreg Clayton lhs_scope->CalculateSymbolContext (&lhs_sc); 93*6dadd508SGreg Clayton rhs_scope->CalculateSymbolContext (&rhs_sc); 94*6dadd508SGreg Clayton 95*6dadd508SGreg Clayton // Items with the same function can only be compared 96*6dadd508SGreg Clayton if (lhs_sc.function == rhs_sc.function && 97*6dadd508SGreg Clayton lhs_sc.function != NULL && lhs_sc.block != NULL && 98*6dadd508SGreg Clayton rhs_sc.function != NULL && rhs_sc.block != NULL) 99*6dadd508SGreg Clayton { 100*6dadd508SGreg Clayton return rhs_sc.block->Contains (lhs_sc.block); 101*6dadd508SGreg Clayton } 102*6dadd508SGreg Clayton } 103*6dadd508SGreg Clayton return false; 10430fdc8d8SChris Lattner } 105