arch,base,cpu,sim: Statically allocate debugSymbolTable.
authorGabe Black <gabeblack@google.com>
Tue, 21 Jan 2020 23:25:09 +0000 (15:25 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 19 May 2020 22:32:50 +0000 (22:32 +0000)
This singleton object is used thruoughout the simulator. There is
really no reason not to have it statically allocated, except that
whether it was allocated seems to sometimes be used as a signal that
something already put symbols in it, specifically in SE mode.

To keep that functionality for the moment, this change adds an "empty"
method to the SymbolTable class to make it easy to check if the symbol
table is empty, or if someone already populated it.

Change-Id: Ia93510082d3f9809fc504bc5803254d8c308d572
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24785
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
14 files changed:
src/arch/arm/freebsd/fs_workload.cc
src/arch/arm/fs_workload.cc
src/arch/arm/linux/fs_workload.cc
src/arch/x86/faults.cc
src/base/cp_annotate.cc
src/base/loader/symtab.cc
src/base/loader/symtab.hh
src/cpu/base.cc
src/cpu/exetrace.cc
src/mem/abstract_mem.cc
src/sim/kernel_workload.cc
src/sim/process.cc
src/sim/pseudo_inst.cc
src/sim/syscall_emul.hh

index ea99b427387c59e065355d587ae3346c93e0034f..e3660d9b17dbc5da33803052e629a0e4e8798313 100644 (file)
@@ -83,7 +83,7 @@ FsFreebsd::initState()
     if (params()->early_kernel_symbols) {
         kernelObj->loadGlobalSymbols(kernelSymtab, 0, 0, _loadAddrMask);
         kernelObj->loadGlobalSymbols(
-                Loader::debugSymbolTable, 0, 0, _loadAddrMask);
+                &Loader::debugSymbolTable, 0, 0, _loadAddrMask);
     }
 
     // Check if the kernel image has a symbol that tells us it supports
index 09c7bb2e73f92b994db587f4b382596fc23094d2..4c654b82205e31429ddefca11a245e541b56e009 100644 (file)
@@ -91,7 +91,7 @@ FsWorkload::FsWorkload(Params *p) : KernelWorkload(*p)
              "Can't find a matching boot loader / kernel combination!");
 
     if (bootldr)
-        bootldr->loadGlobalSymbols(Loader::debugSymbolTable);
+        bootldr->loadGlobalSymbols(&Loader::debugSymbolTable);
 }
 
 void
index 9ebb1172b63969606cc6fd192939054f2d1dc6d1..7f0853fdcf8887207a35349d8fada9888f199fff 100644 (file)
@@ -78,7 +78,7 @@ FsLinux::initState()
     if (params()->early_kernel_symbols) {
         kernelObj->loadGlobalSymbols(kernelSymtab, 0, 0, _loadAddrMask);
         kernelObj->loadGlobalSymbols(
-                Loader::debugSymbolTable, 0, 0, _loadAddrMask);
+                &Loader::debugSymbolTable, 0, 0, _loadAddrMask);
     }
 
     // Setup boot data structure
index 98bd1075569c4d7ca20f6e1033b9620a04e1583e..0754da3887abcf9cf468abfd0a220469270ed475 100644 (file)
@@ -169,7 +169,7 @@ namespace X86ISA
                 panic("Tried to %s unmapped address %#x.\nPC: %#x, Instr: %s",
                       modeStr, addr, tc->pcState().pc(),
                       inst->disassemble(tc->pcState().pc(),
-                          Loader::debugSymbolTable));
+                          &Loader::debugSymbolTable));
             }
         }
     }
index c886e39704af37830fbc606edd533afbab0e52d5..159e6e0f71f69a6768a7cf55fb7c5b378da5ffc4 100644 (file)
@@ -163,7 +163,7 @@ CPA::swSmBegin(ThreadContext *tc, Addr sm_string, int32_t sm_id, int32_t flags)
     Addr junk;
     char sm[50];
     if (!TheISA::inUserMode(tc))
-        Loader::debugSymbolTable->findNearestSymbol(
+        Loader::debugSymbolTable.findNearestSymbol(
             tc->readIntReg(ReturnAddressReg), st, junk);
 
     tc->getVirtProxy().readString(sm, sm_string, 50);
@@ -337,7 +337,7 @@ CPA::swAutoBegin(ThreadContext *tc, Addr next_pc)
     Addr sym_addr = 0;
 
     if (!TheISA::inUserMode(tc)) {
-        Loader::debugSymbolTable->findNearestSymbol(next_pc, sym, sym_addr);
+        Loader::debugSymbolTable.findNearestSymbol(next_pc, sym, sym_addr);
     } else {
         Linux::ThreadInfo ti(tc);
         string app = ti.curTaskName();
@@ -390,7 +390,7 @@ CPA::swEnd(ThreadContext *tc)
     std::string st;
     Addr junk;
     if (!TheISA::inUserMode(tc))
-        Loader::debugSymbolTable->findNearestSymbol(
+        Loader::debugSymbolTable.findNearestSymbol(
             tc->readIntReg(ReturnAddressReg), st, junk);
     System *sys = tc->getSystemPtr();
     StringWrap name(sys->name());
index a8e1a153426b3047bf5fd263b66c8361e3f5cc89..eaada2268adbed0ef6ab3fba769af94f91dd22d1 100644 (file)
@@ -44,7 +44,7 @@ using namespace std;
 namespace Loader
 {
 
-SymbolTable *debugSymbolTable = NULL;
+SymbolTable debugSymbolTable;
 
 void
 SymbolTable::clear()
index 38e97ea9c022038779b38a4e4f9ff11754fb401f..30f0a4fcb2abd5b73c86233cc24b1a9e77a6e4de 100644 (file)
@@ -93,6 +93,7 @@ class SymbolTable
     bool insert(const Symbol &symbol);
     bool insert(const SymbolTable &other);
     bool load(const std::string &file);
+    bool empty() const { return symbols.empty(); }
 
     void serialize(const std::string &base, CheckpointOut &cp) const;
     void unserialize(const std::string &base, CheckpointIn &cp,
@@ -156,7 +157,7 @@ class SymbolTable
 /// there should be one of these per System object for full system,
 /// and per Process object for non-full-system, but so far one big
 /// global one has worked well enough.
-extern SymbolTable *debugSymbolTable;
+extern SymbolTable debugSymbolTable;
 
 } // namespace Loader
 
index a74e285cada6a854f4f94d07d491430c3fb5174d..dc3cbf051c826577ce907ff7562ce2610e45e064 100644 (file)
@@ -751,17 +751,17 @@ bool AddressMonitor::doMonitor(PacketPtr pkt) {
 void
 BaseCPU::traceFunctionsInternal(Addr pc)
 {
-    if (!Loader::debugSymbolTable)
+    if (Loader::debugSymbolTable.empty())
         return;
 
     // if pc enters different function, print new function symbol and
     // update saved range.  Otherwise do nothing.
     if (pc < currentFunctionStart || pc >= currentFunctionEnd) {
-        auto it = Loader::debugSymbolTable->findNearest(
+        auto it = Loader::debugSymbolTable.findNearest(
                 pc, currentFunctionEnd);
 
         string sym_str;
-        if (it == Loader::debugSymbolTable->end()) {
+        if (it == Loader::debugSymbolTable.end()) {
             // no symbol found: use addr as label
             sym_str = csprintf("%#x", pc);
             currentFunctionStart = pc;
index 60c8fd0ac5e5d241291405c09dccbac99d76985f..c9c8b686cc6f4cad8d740697788b5ec03b83632e 100644 (file)
@@ -78,10 +78,9 @@ Trace::ExeTracerRecord::traceInst(const StaticInstPtr &inst, bool ran)
 
     Addr cur_pc = pc.instAddr();
     Loader::SymbolTable::const_iterator it;
-    if (Loader::debugSymbolTable && Debug::ExecSymbol &&
-            (!FullSystem || !inUserMode(thread)) &&
-            (it = Loader::debugSymbolTable->findNearest(cur_pc)) !=
-                Loader::debugSymbolTable->end()) {
+    if (Debug::ExecSymbol && (!FullSystem || !inUserMode(thread)) &&
+            (it = Loader::debugSymbolTable.findNearest(cur_pc)) !=
+                Loader::debugSymbolTable.end()) {
         Addr delta = cur_pc - it->address;
         if (delta)
             ccprintf(outs, "@%s+%d", it->name, delta);
@@ -104,7 +103,7 @@ Trace::ExeTracerRecord::traceInst(const StaticInstPtr &inst, bool ran)
     //
 
     outs << setw(26) << left;
-    outs << inst->disassemble(cur_pc, Loader::debugSymbolTable);
+    outs << inst->disassemble(cur_pc, &Loader::debugSymbolTable);
 
     if (ran) {
         outs << " : ";
index 9323f61e804dc2503223b15b44fffcd4e74368ba..678527e69e9615e8b88fc8974479c7ff1e7458c8 100644 (file)
@@ -80,7 +80,7 @@ AbstractMemory::initState()
     auto *object = Loader::createObjectFile(file, true);
     fatal_if(!object, "%s: Could not load %s.", name(), file);
 
-    panic_if(!object->loadGlobalSymbols(Loader::debugSymbolTable),
+    panic_if(!object->loadGlobalSymbols(&Loader::debugSymbolTable),
              "%s: Could not load symbols from %s.", name(), file);
 
     Loader::MemoryImage image = object->buildImage();
index 415ff9630368b0194cfcb2343462e0fa41526c1c..74f9fc7755cb5fa81c3ef3a7aa244ab1ea63b6eb 100644 (file)
@@ -35,9 +35,6 @@ KernelWorkload::KernelWorkload(const Params &p) : Workload(&p), _params(p),
     _loadAddrMask(p.load_addr_mask), _loadAddrOffset(p.load_addr_offset),
     kernelSymtab(new Loader::SymbolTable), commandLine(p.command_line)
 {
-    if (!Loader::debugSymbolTable)
-        Loader::debugSymbolTable = new Loader::SymbolTable;
-
     if (params().object_file == "") {
         inform("No kernel set for full system simulation. "
                "Assuming you know what you're doing.");
@@ -70,10 +67,10 @@ KernelWorkload::KernelWorkload(const Params &p) : Workload(&p), _params(p),
         fatal_if(!kernelObj->loadLocalSymbols(kernelSymtab),
                 "Could not load kernel local symbols.");
 
-        fatal_if(!kernelObj->loadGlobalSymbols(Loader::debugSymbolTable),
+        fatal_if(!kernelObj->loadGlobalSymbols(&Loader::debugSymbolTable),
                 "Could not load kernel symbols.");
 
-        fatal_if(!kernelObj->loadLocalSymbols(Loader::debugSymbolTable),
+        fatal_if(!kernelObj->loadLocalSymbols(&Loader::debugSymbolTable),
                 "Could not load kernel local symbols.");
     }
 
index a55362d0a0f1dd68035cb41756a0363677ecaeac..9a88163754af5383174ecd036f81d39dc8b42d89 100644 (file)
@@ -155,13 +155,11 @@ Process::Process(ProcessParams *params, EmulationPageTable *pTable,
 
     image = objFile->buildImage();
 
-    if (!::Loader::debugSymbolTable) {
-        ::Loader::debugSymbolTable = new ::Loader::SymbolTable();
-        if (!objFile->loadGlobalSymbols(::Loader::debugSymbolTable) ||
-            !objFile->loadLocalSymbols(::Loader::debugSymbolTable) ||
-            !objFile->loadWeakSymbols(::Loader::debugSymbolTable)) {
-            delete ::Loader::debugSymbolTable;
-            ::Loader::debugSymbolTable = nullptr;
+    if (::Loader::debugSymbolTable.empty()) {
+        if (!objFile->loadGlobalSymbols(&::Loader::debugSymbolTable) ||
+            !objFile->loadLocalSymbols(&::Loader::debugSymbolTable) ||
+            !objFile->loadWeakSymbols(&::Loader::debugSymbolTable)) {
+            ::Loader::debugSymbolTable.clear();
         }
     }
 }
index 64a9c449e78daa4f574ed4bc94b7846f7a667882..da19168ddc5dc5e4f3744311b3415448e371d9d9 100644 (file)
@@ -267,7 +267,7 @@ addsymbol(ThreadContext *tc, Addr addr, Addr symbolAddr)
 
     tc->getSystemPtr()->workload->insertSymbol(
             { Loader::Symbol::Binding::Global, symbol, addr });
-    Loader::debugSymbolTable->insert(
+    Loader::debugSymbolTable.insert(
             { Loader::Symbol::Binding::Global, symbol, addr });
 }
 
index 5bd9f54f3ca3b865bc217bbc2102cfd17e2c52a4..4a37e99a0a6905394464e42d09053b4fa3e66b82 100644 (file)
@@ -1719,7 +1719,7 @@ mmapFunc(SyscallDesc *desc, ThreadContext *tc,
                 ffdp->getFileName());
 
             if (lib) {
-                lib->loadAllSymbols(Loader::debugSymbolTable,
+                lib->loadAllSymbols(&Loader::debugSymbolTable,
                                 lib->buildImage().minAddr(), start);
             }
         }