* Like mknmlist but rely on ANSI C features.
This commit is contained in:
parent
1bd92dae47
commit
7e540078f1
112
tools/mknmlist-ansi
Normal file
112
tools/mknmlist-ansi
Normal file
@ -0,0 +1,112 @@
|
||||
#
|
||||
#
|
||||
# Create tables so that we can lookup ANSI C objects and functions in
|
||||
# an object file (by reading nm output from stdin).
|
||||
#
|
||||
# This tool makes assumptions compatible with ANSI C. Unfortunately
|
||||
# this implies that we need to rely on ANSI C features.
|
||||
|
||||
function sort(V, N, tmp, i, j) {
|
||||
V[-1] = ""; # Used as a sentinel before V[0].
|
||||
for (i = 1; i < N; i++)
|
||||
for (j = i; V[j - 1] > V[j]; j--) {
|
||||
tmp = V[j];
|
||||
V[j] = V[j - 1];
|
||||
V[j - 1] = tmp;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
ndata = ntext = 0;
|
||||
builtin["sym_function"] = "sym_func_t sym_function(const char *)";
|
||||
builtin["sym_object"] = "void *sym_object(const char *)";
|
||||
#
|
||||
builtin["printf"] = "int printf(const char *, ...)";
|
||||
builtin["sprintf"] = "int sprintf(char *, const char *, ...)";
|
||||
builtin["malloc"] = "void *malloc()";
|
||||
builtin["memcpy"] = "void *memcpy()";
|
||||
builtin["memset"] = "void *memset()";
|
||||
builtin["strcpy"] = "char *strcpy()";
|
||||
#
|
||||
builtin["sin"] = "double sin()";
|
||||
builtin["cos"] = "double cos()";
|
||||
builtin["sinf"] = "float sinf(float)";
|
||||
builtin["cosf"] = "float cosf(float)";
|
||||
builtin[""] = "";
|
||||
}
|
||||
|
||||
# DATA or TEXT (ignored)
|
||||
/^[0123456789abcdef]+ [AVWw] / {
|
||||
print "/* " $1 " " $2 " " $3 " */";
|
||||
}
|
||||
|
||||
# DATA
|
||||
/^[0123456789abcdef]+ [BCDGRS] / {
|
||||
if ($3 != "sym_obj" && $3 != "sym_obj_nelts" &&
|
||||
$3 != "sym_func" && $3 != "sym_func_nelts") {
|
||||
data[ndata++] = $3;
|
||||
}
|
||||
}
|
||||
|
||||
# TEXT
|
||||
/^[0123456789abcdef]+ [T] / {
|
||||
if ($3 != "sym_obj" && $3 != "sym_obj_nelts" &&
|
||||
$3 != "sym_func" && $3 != "sym_func_nelts") {
|
||||
text[ntext++] = $3;
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
sort(data, ndata);
|
||||
sort(text, ntext);
|
||||
|
||||
print "#ifdef __AVR__"
|
||||
print "#define PROGMEM __attribute__((__progmem__))"
|
||||
print "#else"
|
||||
print "#define PROGMEM"
|
||||
print "#endif"
|
||||
print "#include \"loader/sym.h\"";
|
||||
|
||||
print;
|
||||
for (x = 0; x < ndata; x++) {
|
||||
print "static const PROGMEM char __D"x"[] = \""data[x]"\";";
|
||||
}
|
||||
|
||||
# Extern decls. Must deal with compiler builtins etc.
|
||||
print;
|
||||
for (x = 0; x < ndata; x++) {
|
||||
if (builtin[data[x]] != "")
|
||||
print builtin[data[x]] ";";
|
||||
else
|
||||
print "extern int " data[x]";";
|
||||
}
|
||||
|
||||
print;
|
||||
print "const int sym_obj_nelts = " ndata ";";
|
||||
print "PROGMEM const struct sym_bol sym_obj[" ndata "] = {";
|
||||
for (x = 0; x < ndata; x++)
|
||||
print " { (const char *)__D"x", { .obj = (void *)&" data[x] " } },";
|
||||
print "};";
|
||||
|
||||
print;
|
||||
for (x = 0; x < ntext; x++) {
|
||||
print "static const PROGMEM char __T"x"[] = \""text[x]"\";";
|
||||
}
|
||||
|
||||
# Extern decls. Must deal with compiler builtins etc.
|
||||
print;
|
||||
for (x = 0; x < ntext; x++) {
|
||||
if (builtin[text[x]] != "")
|
||||
print builtin[text[x]] ";";
|
||||
else
|
||||
print "extern int " text[x]"();";
|
||||
}
|
||||
|
||||
print;
|
||||
print "const int sym_func_nelts = " ntext ";";
|
||||
print "PROGMEM const struct sym_bol sym_func[" ntext "] = {";
|
||||
for (x = 0; x < ntext; x++)
|
||||
print " { (const char *)__T"x", { .func = (sym_func_t)&" text[x] " } },";
|
||||
print "};";
|
||||
}
|
Loading…
Reference in New Issue
Block a user