arch,base: Stop loading the interpreter in ElfObject.

The interpreter is a separate object file, and while it's convenient to
hide loading it in the code which loads the main object file, it breaks
the conceptual abstraction since you only asked it to load the main
object file.

Also, this makes every object file format reimplement the idea of
loading the interpreter. Admittedly only ELF recognizes and sets up
an interpreter, but other formats conceptually could too.

This does move that limitted hypothetical redundancy out of the object
file formats and moves it into the process objects, but I think
conceptually that's where it belongs. It would also probably be pretty
easy to add a method to the base Process class that would handle
loading an image and also the interpreter image.

This change does not (yet) separate reading symbol tables.

Change-Id: I4a165eac599a9bcd30371a162379e833c4cc89b4
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21465
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2019-10-01 21:22:07 -07:00
parent fbc32cef92
commit dd2b3bde4c
9 changed files with 14 additions and 14 deletions

View File

@@ -78,6 +78,8 @@ AlphaProcess::argsInit(int intSize, int pageSize)
updateBias();
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
std::vector<AuxVector<uint64_t>> auxv;

View File

@@ -271,6 +271,8 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
// load object file into target memory
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
//Setup the auxilliary vectors. These will already have endian conversion.
//Auxilliary vectors are loaded only for elf formatted executables.

View File

@@ -94,6 +94,8 @@ MipsProcess::argsInit(int pageSize)
// load object file into target memory
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
std::vector<AuxVector<IntType>> auxv;

View File

@@ -100,6 +100,8 @@ PowerProcess::argsInit(int intSize, int pageSize)
// load object file into target memory
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
//Setup the auxilliary vectors. These will already have endian conversion.
//Auxilliary vectors are loaded only for elf formatted executables.

View File

@@ -125,6 +125,8 @@ RiscvProcess::argsInit(int pageSize)
updateBias();
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
ElfObject* elfObject = dynamic_cast<ElfObject*>(objFile);
memState->setStackMin(memState->getStackBase());

View File

@@ -209,6 +209,8 @@ SparcProcess::argsInit(int pageSize)
// load object file into target memory
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
enum hardwareCaps
{

View File

@@ -775,6 +775,8 @@ X86Process::argsInit(int pageSize,
// load object file into target memory
objFile->loadSegments(initVirtMem);
if (objFile->getInterpreter())
objFile->getInterpreter()->loadSegments(initVirtMem);
enum X86CpuFeature {
X86_OnboardFPU = 1 << 0,

View File

@@ -464,18 +464,6 @@ ElfObject::loadWeakSymbols(SymbolTable *symtab, Addr base, Addr offset,
return loadSomeSymbols(symtab, STB_WEAK, addr_mask, base, offset);
}
bool
ElfObject::loadSegments(const PortProxy &mem_proxy)
{
if (!ObjectFile::loadSegments(mem_proxy))
return false;
if (interpreter)
interpreter->loadSegments(mem_proxy);
return true;
}
void
ElfObject::getSections()
{

View File

@@ -89,8 +89,6 @@ class ElfObject : public ObjectFile
public:
virtual ~ElfObject() {}
bool loadSegments(const PortProxy &mem_proxy) override;
virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
Addr offset = 0, Addr addr_mask = maxAddr)
override;