aboutsummaryrefslogtreecommitdiff
path: root/src/rt
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust.cpp6
-rw-r--r--src/rt/rust_crate.cpp86
-rw-r--r--src/rt/rust_internal.h5
-rw-r--r--src/rt/rust_log.cpp83
-rw-r--r--src/rt/rust_log.h2
5 files changed, 89 insertions, 93 deletions
diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp
index 013705f2..6a421736 100644
--- a/src/rt/rust.cpp
+++ b/src/rt/rust.cpp
@@ -78,9 +78,11 @@ command_line_args : public dom_owned<command_line_args>
extern "C" CDECL int
rust_start(uintptr_t main_fn, rust_crate const *crate, int argc,
- char **argv) {
+ char **argv, void* crate_map) {
- crate->update_log_settings(getenv("RUST_LOG"));
+ // Only when we're on rustc is the last argument passed
+ if (!crate->get_image_base())
+ update_log_settings(crate_map, getenv("RUST_LOG"));
rust_srv *srv = new rust_srv();
rust_kernel *kernel = new rust_kernel(srv);
kernel->start();
diff --git a/src/rt/rust_crate.cpp b/src/rt/rust_crate.cpp
index e7ee0350..23f01c07 100644
--- a/src/rt/rust_crate.cpp
+++ b/src/rt/rust_crate.cpp
@@ -65,92 +65,6 @@ rust_crate::get_debug_abbrev(rust_dom *dom) const {
return mem_area(dom, 0, 0);
}
-struct mod_entry {
- const char* name;
- int* state;
-};
-
-struct cratemap {
- mod_entry* entries;
- cratemap* children[1];
-};
-
-struct log_directive {
- char* name;
- size_t level;
-};
-
-const size_t max_log_directives = 255;
-
-size_t parse_logging_spec(char* spec, log_directive* dirs) {
- size_t dir = 0;
- while (dir < max_log_directives && *spec) {
- char* start = spec;
- char cur;
- while (true) {
- cur = *spec;
- if (cur == ',' || cur == '=' || cur == '\0') {
- if (start == spec) {spec++; break;}
- *spec = '\0';
- spec++;
- size_t level = 3;
- if (cur == '=') {
- level = *spec - '0';
- if (level > 3) level = 1;
- if (*spec) ++spec;
- }
- dirs[dir].name = start;
- dirs[dir++].level = level;
- break;
- }
- spec++;
- }
- }
- return dir;
-}
-
-void update_crate_map(cratemap* map, log_directive* dirs, size_t n_dirs) {
- // First update log levels for this crate
- for (mod_entry* cur = map->entries; cur->name; cur++) {
- size_t level = 1, longest_match = 0;
- for (size_t d = 0; d < n_dirs; d++) {
- if (strstr(cur->name, dirs[d].name) == cur->name &&
- strlen(dirs[d].name) > longest_match) {
- longest_match = strlen(dirs[d].name);
- level = dirs[d].level;
- }
- }
- *cur->state = level;
- }
-
- // Then recurse on linked crates
- for (size_t i = 0; map->children[i]; i++) {
- update_crate_map(map->children[i], dirs, n_dirs);
- }
-}
-
-void rust_crate::update_log_settings(char* settings) const {
- // Only try this if the crate was generated by Rustc, not rustboot
- if (image_base_off) return;
-
- // This is a rather ugly parser for strings in the form
- // "crate1,crate2.mod3,crate3.x=2". Log levels range 0=err, 1=warn,
- // 2=info, 3=debug. Default is 1. Words without an '=X' part set the log
- // level for that module (and submodules) to 3.
- char* buffer = NULL;
- log_directive dirs[256];
- size_t dir = 0;
- if (settings) {
- buffer = (char*)malloc(strlen(settings));
- strcpy(buffer, settings);
- dir = parse_logging_spec(buffer, &dirs[0]);
- }
-
- update_crate_map((cratemap*)crate_map, &dirs[0], dir);
-
- free(buffer);
-}
-
//
// Local Variables:
// mode: C++
diff --git a/src/rt/rust_internal.h b/src/rt/rust_internal.h
index 695fc21d..4a1f3e45 100644
--- a/src/rt/rust_internal.h
+++ b/src/rt/rust_internal.h
@@ -248,9 +248,6 @@ public:
size_t n_libs;
uintptr_t abi_tag;
- // FIXME: not generated by rustboot, should only be accessed in crates
- // generated by rustc.
- void* crate_map;
// Crates are immutable, constructed by the compiler.
@@ -262,8 +259,6 @@ public:
uintptr_t get_gc_glue() const;
uintptr_t get_exit_task_glue() const;
- void update_log_settings(char* settings) const;
-
struct mem_area
{
rust_dom *dom;
diff --git a/src/rt/rust_log.cpp b/src/rt/rust_log.cpp
index 076c4b0a..8f074cdf 100644
--- a/src/rt/rust_log.cpp
+++ b/src/rt/rust_log.cpp
@@ -218,3 +218,86 @@ void
rust_log::reset_indent(uint32_t indent) {
_indent = indent;
}
+
+struct mod_entry {
+ const char* name;
+ int* state;
+};
+
+struct cratemap {
+ mod_entry* entries;
+ cratemap* children[1];
+};
+
+struct log_directive {
+ char* name;
+ size_t level;
+};
+
+const size_t max_log_directives = 255;
+
+// This is a rather ugly parser for strings in the form
+// "crate1,crate2.mod3,crate3.x=2". Log levels range 0=err, 1=warn, 2=info,
+// 3=debug. Default is 1. Words without an '=X' part set the log level for
+// that module (and submodules) to 3.
+size_t parse_logging_spec(char* spec, log_directive* dirs) {
+ size_t dir = 0;
+ while (dir < max_log_directives && *spec) {
+ char* start = spec;
+ char cur;
+ while (true) {
+ cur = *spec;
+ if (cur == ',' || cur == '=' || cur == '\0') {
+ if (start == spec) {spec++; break;}
+ *spec = '\0';
+ spec++;
+ size_t level = 3;
+ if (cur == '=') {
+ level = *spec - '0';
+ if (level > 3) level = 1;
+ if (*spec) ++spec;
+ }
+ dirs[dir].name = start;
+ dirs[dir++].level = level;
+ break;
+ }
+ spec++;
+ }
+ }
+ return dir;
+}
+
+void update_crate_map(cratemap* map, log_directive* dirs, size_t n_dirs) {
+ // First update log levels for this crate
+ for (mod_entry* cur = map->entries; cur->name; cur++) {
+ size_t level = 1, longest_match = 0;
+ for (size_t d = 0; d < n_dirs; d++) {
+ if (strstr(cur->name, dirs[d].name) == cur->name &&
+ strlen(dirs[d].name) > longest_match) {
+ longest_match = strlen(dirs[d].name);
+ level = dirs[d].level;
+ }
+ }
+ *cur->state = level;
+ }
+
+ // Then recurse on linked crates
+ for (size_t i = 0; map->children[i]; i++) {
+ update_crate_map(map->children[i], dirs, n_dirs);
+ }
+}
+
+void update_log_settings(void* crate_map, char* settings) {
+ char* buffer = NULL;
+ log_directive dirs[256];
+ size_t dir = 0;
+ if (settings) {
+ buffer = (char*)malloc(strlen(settings));
+ strcpy(buffer, settings);
+ dir = parse_logging_spec(buffer, &dirs[0]);
+ }
+
+ update_crate_map((cratemap*)crate_map, &dirs[0], dir);
+
+ free(buffer);
+}
diff --git a/src/rt/rust_log.h b/src/rt/rust_log.h
index 3b40869b..150d239a 100644
--- a/src/rt/rust_log.h
+++ b/src/rt/rust_log.h
@@ -93,4 +93,6 @@ rust_log::is_tracing(uint32_t type_bits) {
return type_bits & _type_bit_mask;
}
+void update_log_settings(void* crate_map, char* settings);
+
#endif /* RUST_LOG_H */