summaryrefslogtreecommitdiff
path: root/rtems-tld.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rtems-tld.cpp')
-rw-r--r--rtems-tld.cpp63
1 files changed, 54 insertions, 9 deletions
diff --git a/rtems-tld.cpp b/rtems-tld.cpp
index 05be0be..0861674 100644
--- a/rtems-tld.cpp
+++ b/rtems-tld.cpp
@@ -186,7 +186,7 @@ namespace rld
/**
* Generate the wrapper object file.
*/
- void generate ();
+ const std::string generate ();
/**
* Generate the trace functions.
@@ -227,14 +227,21 @@ namespace rld
void generate_wrapper ();
/**
+ * Compile the C file.
+ */
+ void compile_wrapper ();
+
+ /**
* Dump the linker.
*/
void dump (std::ostream& out) const;
private:
- rld::config::config config; /**< User configuration. */
- tracer tracer_; /**< The tracer */
+ rld::config::config config; /**< User configuration. */
+ tracer tracer_; /**< The tracer */
+ std::string wrapper_c; /**< Wrapper C source file. */
+ std::string wrapper_o; /**< Wrapper object file. */
};
/**
@@ -536,7 +543,7 @@ namespace rld
generator_ = generator (config, gen);
}
- void
+ const std::string
tracer::generate ()
{
rld::process::tempfile c (".c");
@@ -571,6 +578,8 @@ namespace rld
}
c.close ();
+
+ return c.name ();
}
void
@@ -706,7 +715,44 @@ namespace rld
void
linker::generate_wrapper ()
{
- tracer_.generate ();
+ wrapper_c = tracer_.generate ();
+ }
+
+ void
+ linker::compile_wrapper ()
+ {
+ rld::process::arg_container args;
+
+ rld::process::tempfile o (".o");
+
+ if (rld::verbose ())
+ std::cout << "wrapper O file: " << o.name () << std::endl;
+
+ rld::cc::make_cc_command (args);
+ rld::cc::append_flags (rld::cc::ft_cflags, args);
+
+ args.push_back ("-c");
+ args.push_back ("-o ");
+ args.push_back (o.name ());
+ args.push_back (wrapper_c);
+
+ rld::process::tempfile out;
+ rld::process::tempfile err;
+ rld::process::status status;
+
+ status = rld::process::execute (rld::cc::get_cc (),
+ args,
+ out.name (),
+ err.name ());
+
+ if ((status.type != rld::process::status::normal) ||
+ (status.code != 0))
+ {
+ err.output (rld::cc::get_cc (), std::cout);
+ throw rld::error ("Compiler error", "compiling wrapper");
+ }
+
+ wrapper_o = o.name ();
}
void
@@ -811,7 +857,6 @@ main (int argc, char* argv[])
std::string ld_cmd;
std::string configuration;
std::string trace = "tracer";
- bool exec_prefix_set = false;
bool arch_bsp_load = false;
while (true)
@@ -843,12 +888,11 @@ main (int argc, char* argv[])
break;
case 'E':
- exec_prefix_set = true;
- rld::cc::exec_prefix = optarg;
+ rld::cc::set_exec_prefix (optarg);
break;
case 'c':
- rld::cc::cflags = optarg;
+ rld::cc::append_flags (optarg, rld::cc::ft_cflags);
break;
case 'r':
@@ -909,6 +953,7 @@ main (int argc, char* argv[])
{
linker.load_config (configuration, trace);
linker.generate_wrapper ();
+ linker.compile_wrapper ();
if (rld::verbose ())
linker.dump (std::cout);