Similar to Disassemble(), it'd be for reasoning about why an individual symbol is larger.
Disassembly can be hard to read, so the idea here is to annotate each line of a function with the number of bytes it's responsible for.
How to do this?
Not really sure of best way, but one way would just be to post-process the Disassembly output:
* Take the file path in the first source line as the "path of interest"
* Ignore source lines from other files (e.g. .h files)
* Subtract address ranges between lines in the same file to come up with sizes.
Example desired output:
100 ; ./../../chrome/browser/autofill/android/personal_data_manager_android.cc:108
; ConvertJavaStringToUTF8(Java_AutofillProfile_getOrigin(env, jprofile)));
20 ; ./../../chrome/browser/autofill/android/personal_data_manager_android.cc:107
; profile->set_origin(
^^ sizes are from delta addresses
Another idea would be to leave the disassembly output the same, but add the indents and highlight with colour lines from the .cc file (or whatever the first path was)
Disassemble() that example is based on:
lib.unstripped/libmonochrome.so: file format ELF32-arm-little
Disassembly of section .text:
$d.66:
_ZN8autofill12_GLOBAL__N_129PopulateNativeProfileFromJavaERKN4base7android12JavaParamRefIP8_jobjectEEP7_JNIEnvPNS_15AutofillProfileE:
; ./../../chrome/browser/autofill/android/personal_data_manager_android.cc:106
; AutofillProfile* profile) {
2b3e0fc: 2d e9 f0 4f svcmi #15788333
2b3e100: 95 b0 0b 92 andls r11, r11, #149
2b3e104: 07 46 08 90 andls r4, r8, r7, lsl #12
; ./gen/chrome/browser/jni_headers/chrome/jni/PersonalDataManager_jni.h:927
; org_chromium_chrome_browser_autofill_PersonalDataManager_00024AutofillProfile_clazz(env),
2b3e108: 08 46 c7 4c stclmi p6, c4, [r7], {8}
2b3e10c: 91 46 0d 46 <unknown>
2b3e110: 7c 44 a0 47 <unknown>
; ./gen/chrome/browser/jni_headers/chrome/jni/PersonalDataManager_jni.h:924
; jmethodID method_id = base::android::MethodID::LazyGet<
2b3e114: c5 4e a0 46 strtmi r4, [r0], r5, asr #29
2b3e118: c5 4a 01 46 strmi r4, [r1], -r5, asr #21
2b3e11c: c5 4b 7e 44 ldrbtmi r4, [lr], #-3013
2b3e120: c5 4c 06 f1 <unknown>
2b3e124: 08 00 7b 44 ldrbtmi r0, [r11], #-8
2b3e128: 7a 44 7c 44 ldrbtmi r4, [r12], #-1146
2b3e12c: 00 90 28 46 strtmi r9, [r8], -r0
2b3e130: 0c 94 b3 46 ldrtmi r9, [r3], r12, lsl #8
2b3e134: 0a 96 9a 46 ldrmi r9, [r10], r10, lsl #12
2b3e138: 03 93 a0 47 strmi r9, [r0, r3, lsl #6]!
; ./gen/chrome/browser/jni_headers/chrome/jni/PersonalDataManager_jni.h:933
; static_cast<jstring>(env->CallObjectMethod(obj.obj(),
2b3e13c: bf 4c 02 46 <unknown>
; ./../../base/android/scoped_java_ref.h:61
; jobject obj() const { return obj_; }
2b3e140: 39 68 28 46 qasxmi r6, r8, r9
; ./gen/chrome/browser/jni_headers/chrome/jni/PersonalDataManager_jni.h:933
; static_cast<jstring>(env->CallObjectMethod(obj.obj(),
2b3e144: 7c 44 a0 47 <unknown>
2b3e148: 06 94 27 46 strtmi r9, [r7], -r6, lsl #8
; ./gen/chrome/browser/jni_headers/chrome/jni/../../../../../../../../base/android/jni_generator/jni_generator_helper.h:51
; base::android::CheckException(env);
2b3e14c: bc 49 04 46 <unknown>
2b3e150: 28 46 79 44 ldrbtmi r4, [r9], #-1576
2b3e154: 09 91 88 47 strmi r9, [r8, r9, lsl #2]
; ./../../base/android/scoped_java_ref.h:76
; JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
2b3e158: cd e9 0f 45 strmi lr, [pc, #-2509]
2b3e15c: 12 ac 0f ae mcrge p12, #0, r10, c15, c2, #0
; ./../../chrome/browser/autofill/android/personal_data_manager_android.cc:108
; ConvertJavaStringToUTF8(Java_AutofillProfile_getOrigin(env, jprofile)));
2b3e160: 20 46 31 46 ldrtmi r4, [r1], -r0, lsr #12
2b3e164: f5 f5 08 d4 strle pc, [r8], #-1525
; ./../../components/autofill/core/browser/autofill_data_model.h:36
; void set_origin(const std::string& origin) { origin_ = origin; }
2b3e168: 09 f1 10 00 andseq pc, r0, r9, lsl #2
2b3e16c: 21 46 ef f5 <unknown>
2b3e170: 05 d7 20 46 strtmi sp, [r0], -r5, lsl #14
; ./../../chrome/browser/autofill/android/personal_data_manager_android.cc:107
; profile->set_origin(
2b3e174: ed f5 34 d6 ldrtle pc, [r4], -sp, ror #11