Mercurial > hg > index.cgi
comparison lwasm/section.c @ 432:58cafa61ab40
Add support for undocumented custom module format (for LW)
Nothing to see here. Move along. These are not the droids you are looking
for.
author | William Astle <lost@l-w.ca> |
---|---|
date | Fri, 18 Nov 2016 21:25:43 -0700 |
parents | 8764142b3192 |
children | ed7b8f74087d |
comparison
equal
deleted
inserted
replaced
431:6df8d62302e2 | 432:58cafa61ab40 |
---|---|
33 char *p2; | 33 char *p2; |
34 char *sn; | 34 char *sn; |
35 char *opts = NULL; | 35 char *opts = NULL; |
36 sectiontab_t *s; | 36 sectiontab_t *s; |
37 | 37 |
38 if (as -> output_format != OUTPUT_OBJ) | 38 if (as -> output_format != OUTPUT_OBJ && as -> output_format != OUTPUT_LWMOD) |
39 { | 39 { |
40 lwasm_register_error(as, l, E_SECTION_TARGET); | 40 lwasm_register_error(as, l, E_SECTION_TARGET); |
41 return; | 41 return; |
42 } | 42 } |
43 | 43 |
60 /* do nothing */ ; | 60 /* do nothing */ ; |
61 | 61 |
62 sn = lw_strndup(*p, p2 - *p); | 62 sn = lw_strndup(*p, p2 - *p); |
63 *p = p2; | 63 *p = p2; |
64 | 64 |
65 if (**p == ',') | 65 if (**p == ',' && as -> output_format != OUTPUT_LWMOD) |
66 { | 66 { |
67 // have opts | 67 // have opts |
68 (*p)++; | 68 (*p)++; |
69 | 69 |
70 for (p2 = *p; *p2 && !isspace(*p2); p2++) | 70 for (p2 = *p; *p2 && !isspace(*p2); p2++) |
71 /* do nothing */ ; | 71 /* do nothing */ ; |
72 | 72 |
73 opts = lw_strndup(*p, p2 - *p); | 73 opts = lw_strndup(*p, p2 - *p); |
74 *p = p2; | 74 *p = p2; |
75 } | |
76 | |
77 if (as -> output_format == OUTPUT_LWMOD) | |
78 { | |
79 for (p2 = sn; *p2; p2++) | |
80 *p2 = tolower(*p2); | |
81 | |
82 if (strcmp(sn, "bss") && strcmp(sn, "main") && strcmp(sn, "init") && strcmp(sn, "calls") && strcmp(sn, "modname")) | |
83 { | |
84 lwasm_register_error(as, l, E_SECTION_NAME); | |
85 lw_free(sn); | |
86 lw_free(opts); | |
87 return; | |
88 } | |
75 } | 89 } |
76 | 90 |
77 for (s = as -> sections; s; s = s -> next) | 91 for (s = as -> sections; s; s = s -> next) |
78 { | 92 { |
79 if (!strcmp(s -> name, sn)) | 93 if (!strcmp(s -> name, sn)) |
88 // create section data structure | 102 // create section data structure |
89 s = lw_alloc(sizeof(sectiontab_t)); | 103 s = lw_alloc(sizeof(sectiontab_t)); |
90 s -> oblen = 0; | 104 s -> oblen = 0; |
91 s -> obsize = 0; | 105 s -> obsize = 0; |
92 s -> obytes = NULL; | 106 s -> obytes = NULL; |
107 s -> tbase = -1; | |
93 s -> name = lw_strdup(sn); | 108 s -> name = lw_strdup(sn); |
94 s -> offset = lw_expr_build(lw_expr_type_special, lwasm_expr_secbase, s); | 109 s -> offset = lw_expr_build(lw_expr_type_special, lwasm_expr_secbase, s); |
95 s -> flags = section_flag_none; | 110 s -> flags = section_flag_none; |
96 s -> reloctab = NULL; | 111 s -> reloctab = NULL; |
97 if (!strcasecmp(sn, "bss") || !strcasecmp(sn, ".bss")) | 112 if (!strcasecmp(sn, "bss") || !strcasecmp(sn, ".bss")) |