status_t Team::GetStatementAtAddress(target_addr_t address, FunctionInstance*& _function, Statement*& _statement) { TRACE_CODE("Team::GetStatementAtAddress(%#" B_PRIx64 ")\n", address); // get the image at the address Image* image = ImageByAddress(address); if (image == NULL) { TRACE_CODE(" -> no image\n"); return B_ENTRY_NOT_FOUND; } ImageDebugInfo* imageDebugInfo = image->GetImageDebugInfo(); if (imageDebugInfo == NULL) { TRACE_CODE(" -> no image debug info\n"); return B_ENTRY_NOT_FOUND; } // get the function FunctionInstance* functionInstance = imageDebugInfo->FunctionAtAddress(address); if (functionInstance == NULL) { TRACE_CODE(" -> no function instance\n"); return B_ENTRY_NOT_FOUND; } // If the function instance has disassembled code attached, we can get the // statement directly. if (DisassembledCode* code = functionInstance->GetSourceCode()) { Statement* statement = code->StatementAtAddress(address); if (statement == NULL) return B_ENTRY_NOT_FOUND; statement->AcquireReference(); _statement = statement; _function = functionInstance; return B_OK; } // get the statement from the image debug info FunctionDebugInfo* functionDebugInfo = functionInstance->GetFunctionDebugInfo(); status_t error = functionDebugInfo->GetSpecificImageDebugInfo() ->GetStatement(functionDebugInfo, address, _statement); if (error != B_OK) { TRACE_CODE(" -> no statement from the specific image debug info\n"); return error; } _function = functionInstance; return B_OK; }
status_t Team::GetStatementAtSourceLocation(SourceCode* sourceCode, const SourceLocation& location, Statement*& _statement) { TRACE_CODE("Team::GetStatementAtSourceLocation(%p, (%" B_PRId32 ", %" B_PRId32 "))\n", sourceCode, location.Line(), location.Column()); // If we're lucky the source code can provide us with a statement. if (DisassembledCode* code = dynamic_cast<DisassembledCode*>(sourceCode)) { Statement* statement = code->StatementAtLocation(location); if (statement == NULL) return B_ENTRY_NOT_FOUND; statement->AcquireReference(); _statement = statement; return B_OK; } // Go the long and stony way over the source file and the team debug info. // get the source file for the source code LocatableFile* sourceFile = sourceCode->GetSourceFile(); if (sourceFile == NULL) return B_ENTRY_NOT_FOUND; // get the function at the source location Function* function = fDebugInfo->FunctionAtSourceLocation(sourceFile, location); if (function == NULL) return B_ENTRY_NOT_FOUND; // Get some function instance and ask its image debug info to provide us // with a statement. FunctionInstance* functionInstance = function->FirstInstance(); if (functionInstance == NULL) return B_ENTRY_NOT_FOUND; FunctionDebugInfo* functionDebugInfo = functionInstance->GetFunctionDebugInfo(); return functionDebugInfo->GetSpecificImageDebugInfo() ->GetStatementAtSourceLocation(functionDebugInfo, location, _statement); }