124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- StackID.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackID.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 164fb08150367853dae24bb92904356788e919a72fGreg Clayton#include "lldb/Core/Stream.h" 174fb08150367853dae24bb92904356788e919a72fGreg Clayton#include "lldb/Symbol/Block.h" 184fb08150367853dae24bb92904356788e919a72fGreg Clayton#include "lldb/Symbol/Symbol.h" 194fb08150367853dae24bb92904356788e919a72fGreg Clayton#include "lldb/Symbol/SymbolContext.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244fb08150367853dae24bb92904356788e919a72fGreg Claytonvoid 254fb08150367853dae24bb92904356788e919a72fGreg ClaytonStackID::Dump (Stream *s) 264fb08150367853dae24bb92904356788e919a72fGreg Clayton{ 275f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("StackID (pc = 0x%16.16" PRIx64 ", cfa = 0x%16.16" PRIx64 ", symbol_scope = %p", (uint64_t)m_pc, (uint64_t)m_cfa, m_symbol_scope); 284fb08150367853dae24bb92904356788e919a72fGreg Clayton if (m_symbol_scope) 294fb08150367853dae24bb92904356788e919a72fGreg Clayton { 304fb08150367853dae24bb92904356788e919a72fGreg Clayton SymbolContext sc; 314fb08150367853dae24bb92904356788e919a72fGreg Clayton 324fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope->CalculateSymbolContext (&sc); 334fb08150367853dae24bb92904356788e919a72fGreg Clayton if (sc.block) 345f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" (Block {0x%8.8" PRIx64 "})", sc.block->GetID()); 354fb08150367853dae24bb92904356788e919a72fGreg Clayton else if (sc.symbol) 364fb08150367853dae24bb92904356788e919a72fGreg Clayton s->Printf(" (Symbol{0x%8.8x})", sc.symbol->GetID()); 374fb08150367853dae24bb92904356788e919a72fGreg Clayton } 384fb08150367853dae24bb92904356788e919a72fGreg Clayton s->PutCString(") "); 394fb08150367853dae24bb92904356788e919a72fGreg Clayton} 404fb08150367853dae24bb92904356788e919a72fGreg Clayton 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator== (const StackID& lhs, const StackID& rhs) 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs.GetCallFrameAddress() != rhs.GetCallFrameAddress()) 4572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return false; 4672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 4772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 4872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 4972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 5072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // Only compare the PC values if both symbol context scopes are NULL 5172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_scope == NULL && rhs_scope == NULL) 5272b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return lhs.GetPC() == rhs.GetPC(); 5372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 5472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return lhs_scope == rhs_scope; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator!= (const StackID& lhs, const StackID& rhs) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs.GetCallFrameAddress() != rhs.GetCallFrameAddress()) 6172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return true; 6272b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 6372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 6472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 6572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 6672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_scope == NULL && rhs_scope == NULL) 6772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return lhs.GetPC() != rhs.GetPC(); 6872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 6972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return lhs_scope != rhs_scope; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator< (const StackID& lhs, const StackID& rhs) 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton const lldb::addr_t lhs_cfa = lhs.GetCallFrameAddress(); 7672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton const lldb::addr_t rhs_cfa = rhs.GetCallFrameAddress(); 7772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 78441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham // FIXME: We are assuming that the stacks grow downward in memory. That's not necessary, but true on 79441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham // all the machines we care about at present. If this changes, we'll have to deal with that. The ABI is the 80441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham // agent who knows this ordering, but the StackID has no access to the ABI. The most straightforward way 81441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham // to handle this is to add a "m_grows_downward" bool to the StackID, and set it in the constructor. 82441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham // But I'm not going to waste a bool per StackID on this till we need it. 83441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham 8472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_cfa != rhs_cfa) 8572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return lhs_cfa < rhs_cfa; 8672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 8772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *lhs_scope = lhs.GetSymbolContextScope(); 8872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContextScope *rhs_scope = rhs.GetSymbolContextScope(); 8972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 9072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_scope != NULL && rhs_scope != NULL) 9172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton { 9272b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // Same exact scope, lhs is not less than (younger than rhs) 9372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_scope == rhs_scope) 9472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return false; 9572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 9672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContext lhs_sc; 9772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton SymbolContext rhs_sc; 9872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton lhs_scope->CalculateSymbolContext (&lhs_sc); 9972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton rhs_scope->CalculateSymbolContext (&rhs_sc); 10072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton 10172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // Items with the same function can only be compared 10272b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton if (lhs_sc.function == rhs_sc.function && 10372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton lhs_sc.function != NULL && lhs_sc.block != NULL && 10472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton rhs_sc.function != NULL && rhs_sc.block != NULL) 10572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton { 10672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return rhs_sc.block->Contains (lhs_sc.block); 10772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton } 10872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton } 10972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return false; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111