arch,base: Stop loading the interpreter in ElfObject.
authorGabe Black <gabeblack@google.com>
Wed, 2 Oct 2019 04:22:07 +0000 (21:22 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 10 Oct 2019 22:56:52 +0000 (22:56 +0000)
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>

src/arch/alpha/process.cc
src/arch/arm/process.cc
src/arch/mips/process.cc
src/arch/power/process.cc
src/arch/riscv/process.cc
src/arch/sparc/process.cc
src/arch/x86/process.cc
src/base/loader/elf_object.cc
src/base/loader/elf_object.hh

index 59cbebc1c664f98a3091b0aa689cd430e8484c9c..e266b92b2b70603325c256932ac6154ad44dff62 100644 (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;
 
index f98572690995d3ff47f8ab33bc4aea58e32ce7d1..ff3b92f4867e33f494e3efdad90131c3e41a9363 100644 (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.
index 1808372d95f4f770212231a41ff3d173edb389f9..4c4b0e414ce1b38da0ac1c30df8f575c79f7c865 100644 (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;
 
index b391773ee606b66a773122358377767a1669bd53..89b94b21f4d82784d4d94ee6b25e5ad4a4cbd632 100644 (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.
index e15197d786e835cccffcf7aa53b3f0e6f0fb2ddf..35dde76004f8765f54611588a8cec2d3c06a5441 100644 (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());
 
index cca61c1beb801e1901ce87956f10c5fb8ebe8093..1c020c6b165f7aaa71781889b919a05e390ce938 100644 (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
     {
index c743685d0bfd533adefd25a16779901c00ecb79e..5464741388fe21e316ee7c41ca65d0400a90a951 100644 (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,
index 4dee7d2c08bf29cb4cc7cfc61888a6835d97b593..4cf20975d922fafdbac33e2c052bc769f682668d 100644 (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()
 {
index f2af4142a0572057abd333b5fc4aa70cf426036a..dbefadd194aea0d92950381b01ec80b3aca95c41 100644 (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;