Changeset d499e6d in rtems-tools


Ignore:
Timestamp:
Mar 27, 2015, 9:21:33 AM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
bfd2b7d
Parents:
f5b639b
Message:

trace-linker: Add the trace function signatures to the wrapper code.

This gives the tools the ability to extract all needed data from the
executable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-tld.cpp

    rf5b639b rd499e6d  
    269269
    270270      /**
     271       * Generate the trace signature tables.
     272       */
     273      void generate_signatures (rld::process::tempfile& c);
     274
     275      /**
    271276       * Generate the enabled trace bitmap.
    272277       */
     
    277282       */
    278283      void generate_triggers (rld::process::tempfile& c);
     284
     285      /**
     286       * Generate the functions.
     287       */
     288      void generate_functions (rld::process::tempfile& c);
    279289
    280290      /**
     
    290300                            const std::string&      label,
    291301                            const bool              global_set);
     302
     303      /**
     304       * Function macro replace.
     305       */
     306      void macro_func_replace (std::string&       text,
     307                               const signature&   sig,
     308                               const std::string& index);
     309
     310      /**
     311       * Find the function given a name.
     312       */
     313      const function& find_function (const std::string& name) const;
    292314
    293315      /**
     
    919941        c.write_lines (generator_.headers);
    920942        c.write_line ("");
     943        generate_functions (c);
    921944        generate_names (c);
     945        generate_signatures (c);
    922946        generate_enables (c);
    923947        generate_triggers (c);
     
    9801004
    9811005    void
     1006    tracer::generate_signatures (rld::process::tempfile& c)
     1007    {
     1008      const std::string opt = get_option ("gen-sigs");
     1009
     1010      if (opt == "disable")
     1011        return;
     1012
     1013      c.write_line ("");
     1014      c.write_line ("/*");
     1015      c.write_line (" * Signatures.");
     1016      c.write_line (" */");
     1017      c.write_line ("");
     1018      c.write_line ("typedef struct {");
     1019      c.write_line (" uint32_t          size;");
     1020      c.write_line (" const char* const type;");
     1021      c.write_line ("} __rtld_sig_arg;");
     1022      c.write_line ("");
     1023      c.write_line ("typedef struct {");
     1024      c.write_line (" uint32_t              argc;");
     1025      c.write_line (" const __rtld_sig_arg* args;");
     1026      c.write_line ("} __rtld_sig;");
     1027      c.write_line ("");
     1028
     1029      std::stringstream sss;
     1030
     1031      for (rld::strings::const_iterator ti = traces.begin ();
     1032           ti != traces.end ();
     1033           ++ti)
     1034      {
     1035        const std::string& trace = *ti;
     1036        bool               found = false;
     1037
     1038        for (functions::const_iterator fi = functions_.begin ();
     1039             !found && (fi != functions_.end ());
     1040             ++fi)
     1041        {
     1042          const function&            funcs = *fi;
     1043          signatures::const_iterator si = funcs.signatures_.find (trace);
     1044
     1045          if (si != funcs.signatures_.end ())
     1046          {
     1047            found = true;
     1048
     1049            const signature& sig = (*si).second;
     1050
     1051            size_t argc = 1 + (sig.args.size () == 0 ? 1 : sig.args.size ());
     1052
     1053            sss.str (std::string ());
     1054
     1055            sss << "const __rtld_sig_arg __rtld_sig_args_" << trace
     1056                << "[" << argc << "] =" << std::endl
     1057                << "{" << std::endl;
     1058
     1059            if (sig.has_ret ())
     1060              sss << "  { sizeof (" << sig.ret << "), \"" << sig.ret << "\" }," << std::endl;
     1061            else
     1062              sss << "  { 0, \"void\" }," << std::endl;
     1063
     1064            if (sig.has_args ())
     1065            {
     1066              for (size_t a = 0; a < sig.args.size (); ++a)
     1067              {
     1068                sss << "  { sizeof (" << sig.args[a] << "), \"" << sig.args[a] << "\" },"
     1069                    << std::endl;
     1070              }
     1071            }
     1072            else
     1073              sss << "  { 0, \"void\" }," << std::endl;
     1074
     1075            sss << "};" << std::endl;
     1076
     1077            c.write_line (sss.str ());
     1078          }
     1079        }
     1080
     1081        if (!found)
     1082          throw rld::error ("not found", "trace function: " + trace);
     1083      }
     1084
     1085      sss.str (std::string ());
     1086
     1087      sss << "const __rtld_sig __rtld_signatures[" << traces.size () << "] = "
     1088          << "{" << std::endl;
     1089
     1090      for (rld::strings::const_iterator ti = traces.begin ();
     1091           ti != traces.end ();
     1092           ++ti)
     1093      {
     1094        const std::string& trace = *ti;
     1095
     1096        for (functions::const_iterator fi = functions_.begin ();
     1097             fi != functions_.end ();
     1098             ++fi)
     1099        {
     1100          const function&            funcs = *fi;
     1101          signatures::const_iterator si = funcs.signatures_.find (trace);
     1102
     1103          if (si != funcs.signatures_.end ())
     1104          {
     1105            const signature& sig = (*si).second;
     1106            size_t argc = 1 + (sig.args.size () == 0 ? 1 : sig.args.size ());
     1107            sss << "  { " << argc << ", __rtld_sig_args_" << trace << " }," << std::endl;
     1108          }
     1109
     1110          break;
     1111        }
     1112      }
     1113
     1114      sss << "};" << std::endl;
     1115
     1116      c.write_line (sss.str ());
     1117    }
     1118
     1119    void
    9821120    tracer::generate_enables (rld::process::tempfile& c)
    9831121    {
     
    10221160
    10231161    void
    1024     tracer::generate_traces (rld::process::tempfile& c)
    1025     {
     1162    tracer::generate_functions (rld::process::tempfile& c)
     1163    {
     1164      c.write_line ("/*");
     1165      c.write_line (" * Functions.");
     1166      c.write_line (" */");
     1167
    10261168      for (functions::const_iterator fi = functions_.begin ();
    10271169           fi != functions_.end ();
     
    10491191        }
    10501192      }
    1051 
    1052       c.write_line ("");
     1193    }
     1194
     1195    void
     1196    tracer::generate_traces (rld::process::tempfile& c)
     1197    {
    10531198      c.write_line ("/*");
    10541199      c.write_line (" * Wrappers.");
     
    11581303            {
    11591304              l = " " + generator_.entry_alloc;
    1160               l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
    1161               l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    1162               l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    1163               l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
    1164               l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
    1165               l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
     1305              macro_func_replace (l, sig, lss.str ());
    11661306              c.write_line(l);
    11671307            }
     
    11731313            {
    11741314              l = " " + generator_.entry_trace;
    1175               l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
    1176               l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    1177               l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    1178               l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
    1179               l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
    1180               l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
     1315              macro_func_replace (l, sig, lss.str ());
    11811316              c.write_line(l);
    11821317            }
     
    12201355            {
    12211356              l = " " + generator_.exit_alloc;
    1222               l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
    1223               l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    1224               l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    1225               l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
    1226               l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
    1227               l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
     1357              macro_func_replace (l, sig, lss.str ());
    12281358              c.write_line(l);
    12291359            }
     
    12351365            {
    12361366              l = " " + generator_.exit_trace;
    1237               l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
    1238               l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    1239               l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    1240               l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
    1241               l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
     1367              macro_func_replace (l, sig, lss.str ());
    12421368              c.write_line(l);
    12431369            }
     
    13161442
    13171443      c.write_line ("};");
     1444    }
     1445
     1446    void
     1447    tracer::macro_func_replace (std::string&      text,
     1448                               const signature&   sig,
     1449                               const std::string& index)
     1450    {
     1451      text = rld::find_replace (text, "@FUNC_NAME@", '"' + sig.name + '"');
     1452      text = rld::find_replace (text, "@FUNC_INDEX@", index);
     1453      text = rld::find_replace (text, "@FUNC_LABEL@", sig.name);
     1454      text = rld::find_replace (text, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
     1455      text = rld::find_replace (text, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
     1456      text = rld::find_replace (text, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
    13181457    }
    13191458
Note: See TracChangeset for help on using the changeset viewer.