arch,base,sim: Move Process loader hooks into the Process class.
authorGabe Black <gabeblack@google.com>
Fri, 4 Oct 2019 08:21:24 +0000 (01:21 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 16 Oct 2019 01:36:33 +0000 (01:36 +0000)
This code was originally in the ObjectFile class, but not all object
files will become Processes. All Processes will ultimately come from
ObjectFiles though, so it makes more sense to put that class there.

Change-Id: Ie73e4cdecbb51ce53d24cf68911a6cfc0685d771
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21468
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

13 files changed:
src/arch/alpha/linux/process.cc
src/arch/arm/freebsd/process.cc
src/arch/arm/linux/process.cc
src/arch/mips/linux/process.cc
src/arch/power/linux/process.cc
src/arch/riscv/linux/process.cc
src/arch/sparc/linux/process.cc
src/arch/sparc/solaris/process.cc
src/arch/x86/linux/process.cc
src/base/loader/object_file.cc
src/base/loader/object_file.hh
src/sim/process.cc
src/sim/process.hh

index f129b263f7920b7bc0adf547191e634a38de16e9..322a5b9fecfd7e85777953b3bfa703be615a5764 100644 (file)
@@ -48,7 +48,7 @@ using namespace AlphaISA;
 namespace
 {
 
-class AlphaLinuxObjectFileLoader : public ObjectFile::Loader
+class AlphaLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 69424c989a9cade6011afebac7d69c6265155b29..399da3a423e535d489f1d304cb5b2be50a8447d4 100644 (file)
@@ -56,7 +56,7 @@ using namespace ArmISA;
 namespace
 {
 
-class ArmFreebsdObjectFileLoader : public ObjectFile::Loader
+class ArmFreebsdObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 426f66a55d7c30f052486e595b3236736586a3eb..ca8e00c71a72449985409a4a28559bf5f0650ee5 100644 (file)
@@ -65,7 +65,7 @@ using namespace ArmISA;
 namespace
 {
 
-class ArmLinuxObjectFileLoader : public ObjectFile::Loader
+class ArmLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 596f2dda0dbeb54fe56fc6ec8b0104101cfd5bc5..1d2709aa17f056a739eea50787daf87355d20e89 100644 (file)
@@ -51,7 +51,7 @@ using namespace MipsISA;
 namespace
 {
 
-class MipsLinuxObjectFileLoader : public ObjectFile::Loader
+class MipsLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 97032d98989dfd295c0c3ad7318bea30ce11db87..f39de53f8e64c334d1816df799816fb9d0f1c20c 100644 (file)
@@ -51,7 +51,7 @@ using namespace PowerISA;
 namespace
 {
 
-class PowerLinuxObjectFileLoader : public ObjectFile::Loader
+class PowerLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 6708e026f8cc20e98997a2d026ed08af6b5eca2f..4a16f77f716ad61d2e54943ac5f5a85457c04d89 100644 (file)
@@ -55,7 +55,7 @@ using namespace RiscvISA;
 namespace
 {
 
-class RiscvLinuxObjectFileLoader : public ObjectFile::Loader
+class RiscvLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 2fd9838084e69c39cbe9cbdac1edc18641edfd21..5fb3b034844a0ff72d37f0638d6a6e87263c9b5a 100644 (file)
@@ -48,7 +48,7 @@ using namespace SparcISA;
 namespace
 {
 
-class SparcLinuxObjectFileLoader : public ObjectFile::Loader
+class SparcLinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index fb38c77ee290eaf78ef457e5bae0ed3fc3cad80b..18f2316a26163e27a5014cdee30eb934b828d2de 100644 (file)
@@ -46,7 +46,7 @@ using namespace SparcISA;
 namespace
 {
 
-class SparcSolarisObjectFileLoader : public ObjectFile::Loader
+class SparcSolarisObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index 8f669bfa597545f68ed98fa68f3de806080fb46e..dfb1c42f89fa40460687c58803e225a419d1c5bd 100644 (file)
@@ -58,7 +58,7 @@ using namespace X86ISA;
 namespace
 {
 
-class X86LinuxObjectFileLoader : public ObjectFile::Loader
+class X86LinuxObjectFileLoader : public Process::Loader
 {
   public:
     Process *
index b7e05428c42bbe25b3f08e9c02241f3990805635..10c927125fc43cc689dceffbac0f99bfe2a57776 100644 (file)
@@ -42,37 +42,6 @@ using namespace std;
 
 ObjectFile::ObjectFile(ImageFileDataPtr ifd) : ImageFile(ifd) {}
 
-namespace
-{
-
-typedef std::vector<ObjectFile::Loader *> LoaderList;
-
-LoaderList &
-object_file_loaders()
-{
-    static LoaderList loaders;
-    return loaders;
-}
-
-} // anonymous namespace
-
-ObjectFile::Loader::Loader()
-{
-    object_file_loaders().emplace_back(this);
-}
-
-Process *
-ObjectFile::tryLoaders(ProcessParams *params, ObjectFile *obj_file)
-{
-    for (auto &loader: object_file_loaders()) {
-        Process *p = loader->load(params, obj_file);
-        if (p)
-            return p;
-    }
-
-    return nullptr;
-}
-
 namespace {
 
 typedef std::vector<ObjectFileFormat *> ObjectFileFormatList;
index da35db14822ebff51584603f3a42f3f05502d839..0c279c933c1b75c22cb95691db7da70fe79d903d 100644 (file)
@@ -40,8 +40,6 @@
 #include "base/logging.hh"
 #include "base/types.hh"
 
-class Process;
-class ProcessParams;
 class SymbolTable;
 
 class ObjectFile : public ImageFile
@@ -131,38 +129,6 @@ class ObjectFile : public ImageFile
 
   public:
     Addr entryPoint() const { return entry; }
-
-    /**
-     * Each instance of a Loader subclass will have a chance to try to load
-     * an object file when tryLoaders is called. If they can't because they
-     * aren't compatible with it (wrong arch, wrong OS, etc), then they
-     * silently fail by returning nullptr so other loaders can try.
-     */
-    class Loader
-    {
-      public:
-        Loader();
-
-        /* Loader instances are singletons. */
-        Loader(const Loader &) = delete;
-        void operator=(const Loader &) = delete;
-
-        virtual ~Loader() {}
-
-        /**
-         * Each subclass needs to implement this method. If the loader is
-         * compatible with the passed in object file, it should return the
-         * created Process object corresponding to it. If not, it should fail
-         * silently and return nullptr. If there's a non-compatibliity related
-         * error like file IO errors, etc., those should fail non-silently
-         * with a panic or fail as normal.
-         */
-        virtual Process *load(ProcessParams *params, ObjectFile *obj_file) = 0;
-    };
-
-    // Try all the Loader instance's "load" methods one by one until one is
-    // successful. If none are, complain and fail.
-    static Process *tryLoaders(ProcessParams *params, ObjectFile *obj_file);
 };
 
 class ObjectFileFormat
index a01cfea91ccf7ac072af825e9628de3df53d17f6..db013aee08e2468fd6e7f4524ec756c03e8ee36d 100644 (file)
 using namespace std;
 using namespace TheISA;
 
+namespace
+{
+
+typedef std::vector<Process::Loader *> LoaderList;
+
+LoaderList &
+process_loaders()
+{
+    static LoaderList loaders;
+    return loaders;
+}
+
+} // anonymous namespace
+
+Process::Loader::Loader()
+{
+    process_loaders().emplace_back(this);
+}
+
+Process *
+Process::tryLoaders(ProcessParams *params, ObjectFile *obj_file)
+{
+    for (auto &loader: process_loaders()) {
+        Process *p = loader->load(params, obj_file);
+        if (p)
+            return p;
+    }
+
+    return nullptr;
+}
+
 static std::string
 normalize(std::string& directory)
 {
@@ -554,7 +585,7 @@ ProcessParams::create()
     ObjectFile *obj_file = createObjectFile(executable);
     fatal_if(!obj_file, "Cannot load object file %s.", executable);
 
-    Process *process = ObjectFile::tryLoaders(this, obj_file);
+    Process *process = Process::tryLoaders(this, obj_file);
     fatal_if(!process, "Unknown error creating process object.");
 
     return process;
index 8e353071ce527c549700e64ff0afbcf6772de22a..a28d58e9aa0964ad67bedfbaeba8026437387ee6 100644 (file)
@@ -183,6 +183,38 @@ class Process : public SimObject
 
     SETranslatingPortProxy initVirtMem; // memory proxy for initial image load
 
+    /**
+     * Each instance of a Loader subclass will have a chance to try to load
+     * an object file when tryLoaders is called. If they can't because they
+     * aren't compatible with it (wrong arch, wrong OS, etc), then they
+     * silently fail by returning nullptr so other loaders can try.
+     */
+    class Loader
+    {
+      public:
+        Loader();
+
+        /* Loader instances are singletons. */
+        Loader(const Loader &) = delete;
+        void operator=(const Loader &) = delete;
+
+        virtual ~Loader() {}
+
+        /**
+         * Each subclass needs to implement this method. If the loader is
+         * compatible with the passed in object file, it should return the
+         * created Process object corresponding to it. If not, it should fail
+         * silently and return nullptr. If there's a non-compatibliity related
+         * error like file IO errors, etc., those should fail non-silently
+         * with a panic or fail as normal.
+         */
+        virtual Process *load(ProcessParams *params, ObjectFile *obj_file) = 0;
+    };
+
+    // Try all the Loader instance's "load" methods one by one until one is
+    // successful. If none are, complain and fail.
+    static Process *tryLoaders(ProcessParams *params, ObjectFile *obj_file);
+
     ObjectFile *objFile;
     MemoryImage image;
     MemoryImage interpImage;