decompiler
1.0.0
|
The base class for a symbol in a symbol table or scope. More...
#include <database.hh>
Public Types | |
enum | { force_hex = 1, force_dec = 2, force_oct = 3, force_bin = 4, force_char = 5, size_typelock = 8, isolate = 16, merge_problems = 32 } |
Possible display (dispflag) properties for a Symbol. More... | |
Public Member Functions | |
Symbol (Scope *sc, const string &nm, Datatype *ct) | |
Construct given a name and data-type. | |
Symbol (Scope *sc) | |
Construct for use with restoreXml() | |
bool | isNameUndefined (void) const |
Does this have an undefined name. More... | |
void | setIsolated (bool val) |
Set whether this Symbol should be speculatively merged. More... | |
SymbolEntry * | getFirstWholeMap (void) const |
Get the first entire mapping of the symbol. More... | |
SymbolEntry * | getMapEntry (const Address &addr) const |
Get first mapping of the symbol that contains the given Address. More... | |
int4 | getMapEntryPosition (const SymbolEntry *entry) const |
Position of given SymbolEntry within this multi-entry Symbol. More... | |
int4 | getResolutionDepth (const Scope *useScope) const |
Get the number of scope names to print to resolve symbol in given context. More... | |
void | saveXmlHeader (ostream &s) const |
Save basic Symbol properties as XML attributes. More... | |
void | restoreXmlHeader (const Element *el) |
Restore basic Symbol properties from XML. More... | |
void | saveXmlBody (ostream &s) const |
Save details of the Symbol to XML. More... | |
void | restoreXmlBody (List::const_iterator iter) |
Restore details of the Symbol from XML. More... | |
virtual void | saveXml (ostream &s) const |
Save this Symbol to an XML stream. More... | |
virtual void | restoreXml (const Element *el) |
Restore this Symbol from an XML stream. More... | |
virtual int4 | getBytesConsumed (void) const |
Get number of bytes consumed within the address->symbol map. More... | |
Static Public Attributes | |
static uint8 | ID_BASE = 0x4000000000000000L |
Base of internal ID's. | |
Protected Member Functions | |
void | setDisplayFormat (uint4 val) |
Set the display format for this Symbol. More... | |
void | checkSizeTypeLock (void) |
Calculate if size_typelock property is on. More... | |
Protected Attributes | |
Scope * | scope |
The scope that owns this symbol. | |
string | name |
The local name of the symbol. | |
Datatype * | type |
The symbol's data-type. | |
uint4 | nameDedup |
id to distinguish symbols with the same name | |
uint4 | flags |
Varnode-like properties of the symbol. | |
uint4 | dispflags |
Flags affecting the display of this symbol. | |
int2 | category |
Special category (-1==none 0=parameter 1=equate) | |
uint2 | catindex |
Index within category. | |
uint8 | symbolId |
Unique id, 0=unassigned. | |
vector< list< SymbolEntry >::iterator > | mapentry |
List of storage locations labeled with this Symbol. | |
uint4 | wholeCount |
Number of SymbolEntries that map to the whole Symbol. | |
Friends | |
class | Scope |
class | ScopeInternal |
class | SymbolCompareName |
The base class for a symbol in a symbol table or scope.
At its most basic, a Symbol is a name and a data-type. Practically a Symbol knows what Scope its in, how it should be displayed, and the symbols category. A category is a subset of symbols that are stored together for quick access. The category field can be:
anonymous enum |
Possible display (dispflag) properties for a Symbol.
Enumerator | |
---|---|
force_hex | Force hexadecimal printing of constant symbol. |
force_dec | Force decimal printing of constant symbol. |
force_oct | Force octal printing of constant symbol. |
force_bin | Force binary printing of constant symbol. |
force_char | Force integer to be printed as a character constant. |
size_typelock | Only the size of the symbol is typelocked. |
isolate | Symbol should not speculatively merge automatically. |
merge_problems | Set if some SymbolEntrys did not get merged. |
|
protected |
Calculate if size_typelock property is on.
Examine the data-type to decide if the Symbol has the special property called size_typelock, which indicates the size of the Symbol is locked, but the data-type is not locked (and can float)
References dispflags, size_typelock, type, and TYPE_UNKNOWN.
Referenced by EquateSymbol::restoreXml(), restoreXmlBody(), ScopeInternal::retypeSymbol(), and setIsolated().
|
virtual |
Get number of bytes consumed within the address->symbol map.
Get the number of bytes consumed by a SymbolEntry representing this Symbol. By default, this is the number of bytes consumed by the Symbol's data-type. This gives the amount of leeway a search has when the address queried does not match the exact address of the Symbol. With functions, the bytes consumed by a SymbolEntry may not match the data-type size.
Reimplemented in FunctionSymbol.
References type.
Referenced by Scope::addMap().
SymbolEntry * Symbol::getFirstWholeMap | ( | void | ) | const |
Get the first entire mapping of the symbol.
References mapentry, and name.
Referenced by ScopeLocal::addRecommendName(), Funcdata::buildDynamicSymbol(), ScopeGhidra::dump2Cache(), PrintC::emitScopeVarDecls(), Funcdata::findHigh(), ParameterSymbol::getAddress(), FunctionSymbol::getFunction(), ParameterSymbol::getSize(), PrintC::pushPartialSymbol(), PrintC::pushSymbol(), ScopeLocal::recoverNameRecommendationsForSymbols(), ScopeLocal::remapSymbol(), ScopeLocal::remapSymbolDynamic(), ScopeGhidra::resolveExternalRefFunction(), ScopeInternal::restoreXml(), and ProtoStoreSymbol::setInput().
SymbolEntry * Symbol::getMapEntry | ( | const Address & | addr | ) | const |
Get first mapping of the symbol that contains the given Address.
This method may return a partial entry, where the SymbolEntry is only holding part of the whole Symbol.
addr | is an address within the desired storage location of the Symbol |
References Address::getOffset(), Address::getSpace(), and mapentry.
Referenced by Scope::buildDefaultName(), ScopeGhidra::findAddr(), ScopeGhidra::findContainer(), and Merge::mergeMultiEntry().
int4 Symbol::getMapEntryPosition | ( | const SymbolEntry * | entry | ) | const |
Position of given SymbolEntry within this multi-entry Symbol.
Among all the SymbolEntrys that map this entire Symbol, calculate the position of the given SymbolEntry within the list.
entry | is the given SymbolEntry |
int4 Symbol::getResolutionDepth | ( | const Scope * | useScope | ) | const |
Get the number of scope names to print to resolve symbol in given context.
A value of 0 means the base Symbol name is visible and not overridden in the given use scope. A value of 1 means the base name may be overridden, but the parent scope name is not. The minimual number of names that distinguishes this Symbol uniquely within the use scope is returned.
useScope | is the given scope where this Symbol is being used |
References Scope::findDistinguishingScope(), Scope::isNameUsed(), name, and scope.
bool Symbol::isNameUndefined | ( | void | ) | const |
Does this have an undefined name.
The name for a Symbol can be unspecified. See ScopeInternal::buildUndefinedName
References name.
Referenced by ActionNameVars::apply(), ScopeInternal::assignDefaultNames(), Funcdata::attemptDynamicMappingLate(), ScopeInternal::clearUnlocked(), ScopeInternal::clearUnlockedCategory(), PrintC::emitScopeVarDecls(), ParameterSymbol::isNameUndefined(), ActionNameVars::linkSpacebaseSymbol(), ActionNameVars::linkSymbols(), ActionNameVars::lookForFuncParamNames(), ScopeLocal::recoverNameRecommendationsForSymbols(), and ParameterSymbol::setTypeLock().
|
virtual |
Restore this Symbol from an XML stream.
el | is the root XML tag of the symbol |
Reimplemented in ExternRefSymbol, LabSymbol, EquateSymbol, and FunctionSymbol.
References restoreXmlBody(), and restoreXmlHeader().
Referenced by Scope::addMapSym().
void Symbol::restoreXmlBody | ( | List::const_iterator | iter | ) |
Restore details of the Symbol from XML.
iter | iterates over XML children of the root <symbol> tag |
References checkSizeTypeLock(), scope, and type.
Referenced by restoreXml().
void Symbol::restoreXmlHeader | ( | const Element * | el | ) |
Restore basic Symbol properties from XML.
el | is the XML <symbol> element |
References category, catindex, dispflags, flags, force_bin, force_char, force_dec, force_hex, force_oct, Element::getAttributeValue(), Varnode::hiddenretparm, ID_BASE, Varnode::indirectstorage, isolate, name, Varnode::namelock, Varnode::readonly, symbolId, Varnode::typelock, Varnode::volatil, and xml_readbool().
Referenced by restoreXml(), EquateSymbol::restoreXml(), and LabSymbol::restoreXml().
|
virtual |
Save this Symbol to an XML stream.
s | is the output stream |
Reimplemented in ExternRefSymbol, LabSymbol, EquateSymbol, and FunctionSymbol.
References saveXmlBody(), and saveXmlHeader().
Referenced by ScopeInternal::saveXml().
void Symbol::saveXmlBody | ( | ostream & | s | ) | const |
Save details of the Symbol to XML.
Save the data-type for the Symbol
s | is the output stream |
References Datatype::saveXmlRef(), and type.
Referenced by saveXml().
void Symbol::saveXmlHeader | ( | ostream & | s | ) | const |
Save basic Symbol properties as XML attributes.
s | is the output stream |
References a_v(), a_v_b(), a_v_i(), a_v_u(), category, catindex, dispflags, flags, force_bin, force_char, force_dec, force_hex, force_oct, Varnode::hiddenretparm, Varnode::indirectstorage, isolate, name, Varnode::namelock, Varnode::readonly, Varnode::typelock, and Varnode::volatil.
Referenced by saveXml(), EquateSymbol::saveXml(), and LabSymbol::saveXml().
|
inlineprotected |
Set the display format for this Symbol.
Force a specific display format for constant symbols
val | is the format: force_hex, force_dec, force_oct, etc. |
References dispflags.
Referenced by ScopeInternal::setDisplayFormat().
void Symbol::setIsolated | ( | bool | val | ) |
Set whether this Symbol should be speculatively merged.
If the given value is true, any Varnodes that map directly to this Symbol, will not be speculatively merged with other Varnodes. (Required merges will still happen).
val | is the given boolean value |
References checkSizeTypeLock(), dispflags, flags, isolate, and Varnode::typelock.