mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-2237 AddrSpace as marshaling primitive and prettyprint update
This commit is contained in:
parent
4807ec354a
commit
6be9943b8a
58 changed files with 1333 additions and 1098 deletions
|
@ -409,13 +409,13 @@ void Architecture::setPrintLanguage(const string &nm)
|
|||
PrintLanguageCapability *capa = PrintLanguageCapability::findCapability(nm);
|
||||
if (capa == (PrintLanguageCapability *)0)
|
||||
throw LowlevelError("Unknown print language: "+nm);
|
||||
bool printxml = print->emitsXml(); // Copy settings for current print language
|
||||
bool printMarkup = print->emitsMarkup(); // Copy settings for current print language
|
||||
ostream *t = print->getOutputStream();
|
||||
print = capa->buildLanguage(this);
|
||||
print->setOutputStream(t); // Restore settings from previous language
|
||||
print->initializeFromArchitecture();
|
||||
if (printxml)
|
||||
print->setXML(true);
|
||||
if (printMarkup)
|
||||
print->setMarkup(true);
|
||||
printlist.push_back(print);
|
||||
print->adjustTypeOperators();
|
||||
return;
|
||||
|
@ -446,8 +446,8 @@ void Architecture::decodeFlowOverride(Decoder &decoder)
|
|||
uint4 subId = decoder.openElement();
|
||||
if (subId != ELEM_FLOW) break;
|
||||
string flowType = decoder.readString(ATTRIB_TYPE);
|
||||
Address funcaddr = Address::decode(decoder,this);
|
||||
Address overaddr = Address::decode(decoder,this);
|
||||
Address funcaddr = Address::decode(decoder);
|
||||
Address overaddr = Address::decode(decoder);
|
||||
Funcdata *fd = symboltab->getGlobalScope()->queryFunction(funcaddr);
|
||||
if (fd != (Funcdata *)0)
|
||||
fd->getOverride().insertFlowOverride(overaddr,Override::stringToType(flowType));
|
||||
|
@ -482,7 +482,7 @@ void Architecture::restoreXml(DocumentStorage &store)
|
|||
const Element *el = store.getTag(ELEM_SAVE_STATE.getName());
|
||||
if (el == (const Element *)0)
|
||||
throw LowlevelError("Could not find save_state tag");
|
||||
XmlDecode decoder(el);
|
||||
XmlDecode decoder(this,el);
|
||||
uint4 elemId = decoder.openElement(ELEM_SAVE_STATE);
|
||||
loadersymbols_parsed = false;
|
||||
for(;;) {
|
||||
|
@ -500,11 +500,11 @@ void Architecture::restoreXml(DocumentStorage &store)
|
|||
else if (subId == ELEM_DB)
|
||||
symboltab->decode(decoder);
|
||||
else if (subId == ELEM_CONTEXT_POINTS)
|
||||
context->decode(decoder,this);
|
||||
context->decode(decoder);
|
||||
else if (subId == ELEM_COMMENTDB)
|
||||
commentdb->decode(decoder,this);
|
||||
commentdb->decode(decoder);
|
||||
else if (subId == ELEM_STRINGMANAGE)
|
||||
stringManager->decode(decoder,this);
|
||||
stringManager->decode(decoder);
|
||||
else if (subId == ELEM_CONSTANTPOOL)
|
||||
cpool->decode(decoder,*types);
|
||||
else if (subId == ELEM_OPTIONSLIST)
|
||||
|
@ -607,7 +607,7 @@ void Architecture::buildTypegrp(DocumentStorage &store)
|
|||
const Element *el = store.getTag("coretypes");
|
||||
types = new TypeFactory(this); // Initialize the object
|
||||
if (el != (const Element *)0) {
|
||||
XmlDecode decoder(el);
|
||||
XmlDecode decoder(this,el);
|
||||
types->decodeCoreTypes(decoder);
|
||||
}
|
||||
else {
|
||||
|
@ -929,7 +929,7 @@ void Architecture::decodeReadOnly(Decoder &decoder)
|
|||
uint4 elemId = decoder.openElement(ELEM_READONLY);
|
||||
while(decoder.peekElement() != 0) {
|
||||
Range range;
|
||||
range.decode(decoder,this);
|
||||
range.decode(decoder);
|
||||
symboltab->setPropertyRange(Varnode::readonly,range);
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -945,7 +945,7 @@ void Architecture::decodeVolatile(Decoder &decoder)
|
|||
userops.decodeVolatile(decoder,this);
|
||||
while(decoder.peekElement() != 0) {
|
||||
Range range;
|
||||
range.decode(decoder,this); // Tag itself is range
|
||||
range.decode(decoder); // Tag itself is range
|
||||
symboltab->setPropertyRange(Varnode::volatil,range);
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -962,7 +962,7 @@ void Architecture::decodeReturnAddress(Decoder &decoder)
|
|||
if (subId != 0) {
|
||||
if (defaultReturnAddr.space != (AddrSpace *)0)
|
||||
throw LowlevelError("Multiple <returnaddress> tags in .cspec");
|
||||
defaultReturnAddr.decode(decoder,this);
|
||||
defaultReturnAddr.decode(decoder);
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
}
|
||||
|
@ -976,7 +976,7 @@ void Architecture::decodeIncidentalCopy(Decoder &decoder)
|
|||
uint4 elemId = decoder.openElement(ELEM_INCIDENTALCOPY);
|
||||
while(decoder.peekElement() != 0) {
|
||||
VarnodeData vdata;
|
||||
vdata.decode(decoder,this);
|
||||
vdata.decode(decoder);
|
||||
Range range( vdata.space, vdata.offset, vdata.offset+vdata.size-1);
|
||||
symboltab->setPropertyRange(Varnode::incidental_copy,range);
|
||||
}
|
||||
|
@ -994,7 +994,7 @@ void Architecture::decodeLaneSizes(Decoder &decoder)
|
|||
|
||||
uint4 elemId = decoder.openElement(ELEM_REGISTER_DATA);
|
||||
while(decoder.peekElement() != 0) {
|
||||
if (lanedRegister.decode(decoder, this)) {
|
||||
if (lanedRegister.decode(decoder)) {
|
||||
int4 sizeIndex = lanedRegister.getWholeSize();
|
||||
while (maskList.size() <= sizeIndex)
|
||||
maskList.push_back(0);
|
||||
|
@ -1016,10 +1016,10 @@ void Architecture::decodeStackPointer(Decoder &decoder)
|
|||
{
|
||||
uint4 elemId = decoder.openElement(ELEM_STACKPOINTER);
|
||||
|
||||
string spaceName;
|
||||
string registerName;
|
||||
bool stackGrowth = true; // Default stack growth is in negative direction
|
||||
bool isreversejustify = false;
|
||||
AddrSpace *basespace = (AddrSpace *)0;
|
||||
for(;;) {
|
||||
uint4 attribId = decoder.getNextAttributeId();
|
||||
if (attribId == 0) break;
|
||||
|
@ -1028,14 +1028,13 @@ void Architecture::decodeStackPointer(Decoder &decoder)
|
|||
else if (attribId == ATTRIB_GROWTH)
|
||||
stackGrowth = decoder.readString() == "negative";
|
||||
else if (attribId == ATTRIB_SPACE)
|
||||
spaceName = decoder.readString();
|
||||
basespace = decoder.readSpace();
|
||||
else if (attribId == ATTRIB_REGISTER)
|
||||
registerName = decoder.readString();
|
||||
}
|
||||
|
||||
AddrSpace *basespace = getSpaceByName(spaceName);
|
||||
if (basespace == (AddrSpace *)0)
|
||||
throw LowlevelError("Unknown space name: "+spaceName);
|
||||
throw LowlevelError(ELEM_STACKPOINTER.getName() + " element missing \"space\" attribute");
|
||||
|
||||
VarnodeData point = translate->getRegister(registerName);
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -1056,10 +1055,7 @@ void Architecture::decodeDeadcodeDelay(Decoder &decoder)
|
|||
|
||||
{
|
||||
uint4 elemId = decoder.openElement(ELEM_DEADCODEDELAY);
|
||||
string spaceName = decoder.readString(ATTRIB_SPACE);
|
||||
AddrSpace *spc = getSpaceByName(spaceName);
|
||||
if (spc == (AddrSpace *)0)
|
||||
throw LowlevelError("Unknown space name: "+spaceName);
|
||||
AddrSpace *spc = decoder.readSpace(ATTRIB_SPACE);
|
||||
int4 delay = decoder.readSignedInteger(ATTRIB_DELAY);
|
||||
if (delay >= 0)
|
||||
setDeadcodeDelay(spc,delay);
|
||||
|
@ -1075,7 +1071,7 @@ void Architecture::decodeInferPtrBounds(Decoder &decoder)
|
|||
uint4 elemId = decoder.openElement(ELEM_INFERPTRBOUNDS);
|
||||
while(decoder.peekElement() != 0) {
|
||||
Range range;
|
||||
range.decode(decoder,this);
|
||||
range.decode(decoder);
|
||||
setInferPtrBounds(range);
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -1113,12 +1109,9 @@ void Architecture::decodeSpacebase(Decoder &decoder)
|
|||
uint4 elemId = decoder.openElement(ELEM_SPACEBASE);
|
||||
string nameString = decoder.readString(ATTRIB_NAME);
|
||||
string registerName = decoder.readString(ATTRIB_REGISTER);
|
||||
string spaceName = decoder.readString(ATTRIB_SPACE);
|
||||
AddrSpace *basespace = decoder.readSpace(ATTRIB_SPACE);
|
||||
decoder.closeElement(elemId);
|
||||
const VarnodeData &point(translate->getRegister(registerName));
|
||||
AddrSpace *basespace = getSpaceByName(spaceName);
|
||||
if (basespace == (AddrSpace *)0)
|
||||
throw LowlevelError("Unknown space name: "+spaceName);
|
||||
addSpacebase(basespace,nameString,point,point.size,false,false);
|
||||
}
|
||||
|
||||
|
@ -1131,7 +1124,7 @@ void Architecture::decodeNoHighPtr(Decoder &decoder)
|
|||
uint4 elemId = decoder.openElement(ELEM_NOHIGHPTR);
|
||||
while(decoder.peekElement() != 0) { // Iterate over every range tag in the list
|
||||
Range range;
|
||||
range.decode(decoder,this);
|
||||
range.decode(decoder);
|
||||
addNoHighPtr(range);
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -1151,7 +1144,7 @@ void Architecture::decodePreferSplit(Decoder &decoder)
|
|||
while(decoder.peekElement() != 0) {
|
||||
splitrecords.emplace_back();
|
||||
PreferSplitRecord &record( splitrecords.back() );
|
||||
record.storage.decode( decoder, this );
|
||||
record.storage.decode( decoder );
|
||||
record.splitoffset = record.storage.size/2;
|
||||
}
|
||||
decoder.closeElement(elemId);
|
||||
|
@ -1203,7 +1196,7 @@ void Architecture::parseProcessorConfig(DocumentStorage &store)
|
|||
const Element *el = store.getTag("processor_spec");
|
||||
if (el == (const Element *)0)
|
||||
throw LowlevelError("No processor configuration tag found");
|
||||
XmlDecode decoder(el);
|
||||
XmlDecode decoder(this,el);
|
||||
|
||||
uint4 elemId = decoder.openElement(ELEM_PROCESSOR_SPEC);
|
||||
for(;;) {
|
||||
|
@ -1218,7 +1211,7 @@ void Architecture::parseProcessorConfig(DocumentStorage &store)
|
|||
else if (subId == ELEM_INCIDENTALCOPY)
|
||||
decodeIncidentalCopy(decoder);
|
||||
else if (subId == ELEM_CONTEXT_DATA)
|
||||
context->decodeFromSpec(decoder,this);
|
||||
context->decodeFromSpec(decoder);
|
||||
else if (subId == ELEM_JUMPASSIST)
|
||||
userops.decodeJumpAssist(decoder, this);
|
||||
else if (subId == ELEM_SEGMENTOP)
|
||||
|
@ -1228,11 +1221,8 @@ void Architecture::parseProcessorConfig(DocumentStorage &store)
|
|||
}
|
||||
else if (subId == ELEM_DATA_SPACE) {
|
||||
uint4 elemId = decoder.openElement();
|
||||
string spaceName = decoder.readString(ATTRIB_SPACE);
|
||||
AddrSpace *spc = decoder.readSpace(ATTRIB_SPACE);
|
||||
decoder.closeElement(elemId);
|
||||
AddrSpace *spc = getSpaceByName(spaceName);
|
||||
if (spc == (AddrSpace *)0)
|
||||
throw LowlevelError("Undefined space: "+spaceName);
|
||||
setDefaultDataSpace(spc->getIndex());
|
||||
}
|
||||
else if (subId == ELEM_INFERPTRBOUNDS) {
|
||||
|
@ -1273,7 +1263,7 @@ void Architecture::parseCompilerConfig(DocumentStorage &store)
|
|||
const Element *el = store.getTag("compiler_spec");
|
||||
if (el == (const Element *)0)
|
||||
throw LowlevelError("No compiler configuration tag found");
|
||||
XmlDecode decoder(el);
|
||||
XmlDecode decoder(this,el);
|
||||
|
||||
uint4 elemId = decoder.openElement(ELEM_COMPILER_SPEC);
|
||||
for(;;) {
|
||||
|
@ -1306,7 +1296,7 @@ void Architecture::parseCompilerConfig(DocumentStorage &store)
|
|||
else if (subId == ELEM_READONLY)
|
||||
decodeReadOnly(decoder);
|
||||
else if (subId == ELEM_CONTEXT_DATA)
|
||||
context->decodeFromSpec(decoder,this);
|
||||
context->decodeFromSpec(decoder);
|
||||
else if (subId == ELEM_RESOLVEPROTOTYPE)
|
||||
decodeProto(decoder);
|
||||
else if (subId == ELEM_EVAL_CALLED_PROTOTYPE)
|
||||
|
@ -1337,7 +1327,7 @@ void Architecture::parseCompilerConfig(DocumentStorage &store)
|
|||
|
||||
el = store.getTag("specextensions"); // Look for any user-defined configuration document
|
||||
if (el != (const Element *)0) {
|
||||
XmlDecode decoderExt(el);
|
||||
XmlDecode decoderExt(this,el);
|
||||
elemId = decoderExt.openElement(ELEM_SPECEXTENSIONS);
|
||||
for(;;) {
|
||||
uint4 subId = decoderExt.peekElement();
|
||||
|
@ -1388,7 +1378,7 @@ void Architecture::parseExtraRules(DocumentStorage &store)
|
|||
{
|
||||
const Element *expertag = store.getTag("experimental_rules");
|
||||
if (expertag != (const Element *)0) {
|
||||
XmlDecode decoder(expertag);
|
||||
XmlDecode decoder(this,expertag);
|
||||
uint4 elemId = decoder.openElement(ELEM_EXPERIMENTAL_RULES);
|
||||
while(decoder.peekElement() != 0)
|
||||
decodeDynamicRule( decoder );
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue