mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
Add to the disassembler C API output reference types for
Objective-C data structures. This is allows tools such as darwin's otool(1) that uses the LLVM disassembler take a pointer value being loaded by an instruction and add a comment to what it is being referenced to make following disassembly of Objective-C programs more readable. For example disassembling the Mac OS X TextEdit app one will see comments like the following: movq 0x20684(%rip), %rsi ## Objc selector ref: standardUserDefaults movq 0x21985(%rip), %rdi ## Objc class ref: _OBJC_CLASS_$_NSUserDefaults movq 0x1d156(%rip), %r14 ## Objc message: +[NSUserDefaults standardUserDefaults] leaq 0x23615(%rip), %rdx ## Objc cfstring ref: @"SelectLinePanel" callq 0x10001386c ## Objc message: -[[%rdi super] initWithWindowNibName:] These diffs also include putting quotes around C strings in literal pools and uses "symbol address" in the comment when adding a symbol name to the comment to tell these types of references apart: leaq 0x4f(%rip), %rax ## literal pool for: "Hello world" movq 0x1c3ea(%rip), %rax ## literal pool symbol address: ___stack_chk_guard Of course the easy changes are in the LLVM disassembler and the hard work is up to the implementer of the SymbolLookUp() call back. rdar://10602439 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193833 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
36fd930ca4
commit
6f45b1f0d6
@ -130,6 +130,17 @@ typedef const char *(*LLVMSymbolLookupCallback)(void *DisInfo,
|
||||
/* The output reference is to a cstring address in a literal pool. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr 3
|
||||
|
||||
/* The output reference is to a Objective-C CoreFoundation string. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref 4
|
||||
/* The output reference is to a Objective-C message. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_Objc_Message 5
|
||||
/* The output reference is to a Objective-C message ref. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref 6
|
||||
/* The output reference is to a Objective-C selector ref. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref 7
|
||||
/* The output reference is to a Objective-C class ref. */
|
||||
#define LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref 8
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* !defined(__cplusplus) */
|
||||
|
@ -63,6 +63,8 @@ bool MCExternalSymbolizer::tryAddingSymbolicOperand(MCInst &MI,
|
||||
}
|
||||
if(ReferenceType == LLVMDisassembler_ReferenceType_Out_SymbolStub)
|
||||
cStream << "symbol stub for: " << ReferenceName;
|
||||
else if(ReferenceType == LLVMDisassembler_ReferenceType_Out_Objc_Message)
|
||||
cStream << "Objc message: " << ReferenceName;
|
||||
if (!Name && !IsBranch)
|
||||
return false;
|
||||
}
|
||||
@ -132,6 +134,8 @@ bool MCExternalSymbolizer::tryAddingSymbolicOperand(MCInst &MI,
|
||||
// literal pool's entry if the referenced address is that of a symbol. Or it
|
||||
// will return a pointer to a literal 'C' string if the referenced address of
|
||||
// the literal pool's entry is an address into a section with C string literals.
|
||||
// Or if the reference is to an Objective-C data structure it will return a
|
||||
// specific reference type for it and a string.
|
||||
void MCExternalSymbolizer::tryAddingPcLoadReferenceComment(raw_ostream &cStream,
|
||||
int64_t Value,
|
||||
uint64_t Address) {
|
||||
@ -139,9 +143,26 @@ void MCExternalSymbolizer::tryAddingPcLoadReferenceComment(raw_ostream &cStream,
|
||||
uint64_t ReferenceType = LLVMDisassembler_ReferenceType_In_PCrel_Load;
|
||||
const char *ReferenceName;
|
||||
(void)SymbolLookUp(DisInfo, Value, &ReferenceType, Address, &ReferenceName);
|
||||
if(ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr ||
|
||||
ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr)
|
||||
cStream << "literal pool for: " << ReferenceName;
|
||||
if(ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr)
|
||||
cStream << "literal pool symbol address: " << ReferenceName;
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr)
|
||||
cStream << "literal pool for: \"" << ReferenceName << "\"";
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref)
|
||||
cStream << "Objc cfstring ref: @\"" << ReferenceName << "\"";
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_Objc_Message)
|
||||
cStream << "Objc message: " << ReferenceName;
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref)
|
||||
cStream << "Objc message ref: " << ReferenceName;
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref)
|
||||
cStream << "Objc selector ref: " << ReferenceName;
|
||||
else if(ReferenceType ==
|
||||
LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref)
|
||||
cStream << "Objc class ref: " << ReferenceName;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user