Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(911)

Unified Diff: syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc

Issue 1475083002: [Refinery] Introduce TypePropagatorAnalyzer - pointer types. (Closed) Base URL: https://github.com/google/syzygy.git@master
Patch Set: Final nit Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc
diff --git a/syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc b/syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc
index 059b4f2e4fcac270a417cbcfcc8bdaf3d3d139e2..331f8fe8f3093c9bb6519bc7b5ebab2792203341 100644
--- a/syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc
+++ b/syzygy/refinery/analyzers/stack_frame_analyzer_impl.cc
@@ -105,9 +105,11 @@ bool GetDataType(TypeNameIndex* typename_index,
StackFrameDataAnalyzer::StackFrameDataAnalyzer(
StackFrameRecordPtr frame_record,
scoped_refptr<TypeNameIndex> typename_index,
+ ModuleId module_id,
ProcessState* process_state)
: frame_record_(frame_record),
typename_index_(typename_index),
+ module_id_(module_id),
process_state_(process_state) {
DCHECK(frame_record.get());
DCHECK(typename_index.get());
@@ -145,12 +147,15 @@ bool StackFrameDataAnalyzer::Analyze(IDiaSymbol* data) {
if (!pe::GetSymName(data, &data_name))
return false;
- base::string16 type_name;
- if (!GetTypeName(data, &type_name))
+ // Get the data's type from the type_repository.
+ TypePtr type;
+ if (!GetDataType(typename_index_.get(), data, &type))
return false;
+ if (type.get() == nullptr)
+ return true; // The type was not found.
AddressRange range;
- if (!GetAddressRange(data, &range))
+ if (!GetAddressRange(data, type, &range))
return false;
// Note: successfully returning an invalid address range means the location
// type is not yet supported.
@@ -161,10 +166,12 @@ bool StackFrameDataAnalyzer::Analyze(IDiaSymbol* data) {
// Add the typed block to the process state's typed block layer.
// TODO(manzagop): handle CV qualifiers.
// TODO(manzagop): avoid duplicating types we already know about.
- return AddTypedBlockRecord(range, data_name, type_name, process_state_);
+ return AddTypedBlockRecord(range, data_name, module_id_, type->type_id(),
+ process_state_);
}
bool StackFrameDataAnalyzer::GetAddressRange(IDiaSymbol* data,
+ TypePtr type,
AddressRange* range) {
DCHECK(data); DCHECK(range);
@@ -174,7 +181,7 @@ bool StackFrameDataAnalyzer::GetAddressRange(IDiaSymbol* data,
switch (location_type) {
case LocIsRegRel:
- return GetAddressRangeRegRel(data, range);
+ return GetAddressRangeRegRel(data, type, range);
case LocIsStatic:
case LocIsTLS:
case LocIsThisRel:
@@ -195,6 +202,7 @@ bool StackFrameDataAnalyzer::GetAddressRange(IDiaSymbol* data,
}
bool StackFrameDataAnalyzer::GetAddressRangeRegRel(IDiaSymbol* data,
+ TypePtr type,
AddressRange* range) {
DCHECK(data); DCHECK(range);
DCHECK(IsLocType(data, LocIsRegRel));
@@ -210,13 +218,6 @@ bool StackFrameDataAnalyzer::GetAddressRangeRegRel(IDiaSymbol* data,
if (!pe::GetSymOffset(data, &register_offset))
return false;
- // Get the data's type from the type_repository.
- TypePtr type;
- if (!GetDataType(typename_index_.get(), data, &type))
- return false;
- if (type.get() == nullptr)
- return true; // The type was not found.
-
// Figure out the data's range.
uint32_t register_value = 0U;
if (!GetRegRelLocationRegisterValue(frame_record_, register_id,
« no previous file with comments | « syzygy/refinery/analyzers/stack_frame_analyzer_impl.h ('k') | syzygy/refinery/analyzers/type_propagator_analyzer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698