| [7] | 1 | #! /usr/bin/perl |
|---|
| 2 | # |
|---|
| 3 | # TOPPERS Software |
|---|
| 4 | # Toyohashi Open Platform for Embedded Real-Time Systems |
|---|
| 5 | # |
|---|
| 6 | # Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory |
|---|
| 7 | # Toyohashi Univ. of Technology, JAPAN |
|---|
| 8 | # Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory |
|---|
| 9 | # Graduate School of Information Science, Nagoya Univ., JAPAN |
|---|
| 10 | # |
|---|
| 11 | # ŸåµÃøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§ |
|---|
| 12 | # ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ |
|---|
| 13 | # ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥ |
|---|
| 14 | # (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ€ÎÃøºî |
|---|
| 15 | # ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ |
|---|
| 16 | # ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥ |
|---|
| 17 | # (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È |
|---|
| 18 | # Íрǀ€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥¥å¥á¥ó¥È¡ÊÍøÍÑ |
|---|
| 19 | # ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ |
|---|
| 20 | # €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥ |
|---|
| 21 | # (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È |
|---|
| 22 | # Íрǀ€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³ |
|---|
| 23 | # €È¡¥ |
|---|
| 24 | # (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ€ÎÃø |
|---|
| 25 | # ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥ |
|---|
| 26 | # (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë |
|---|
| 27 | # Êó¹ð€¹€ë€³€È¡¥ |
|---|
| 28 | # (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë» |
|---|
| 29 | # ³²€«€é€â¡€ŸåµÃøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥ |
|---|
| 30 | # €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý |
|---|
| 31 | # ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€ŸåµÃøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò |
|---|
| 32 | # ÌÈÀÕ€¹€ë€³€È¡¥ |
|---|
| 33 | # |
|---|
| 34 | # ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥ŸåµÃøºîž¢ŒÔ€ª |
|---|
| 35 | # €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ |
|---|
| 36 | # €ËÂЀ¹€ëŬ¹çÀ€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§ |
|---|
| 37 | # ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ |
|---|
| 38 | # €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥ |
|---|
| 39 | # |
|---|
| 40 | # @(#) $Id$ |
|---|
| 41 | # |
|---|
| 42 | |
|---|
| 43 | # |
|---|
| 44 | # œéŽü²œ |
|---|
| 45 | # |
|---|
| 46 | $infile = $ARGV[0]; |
|---|
| 47 | $sil_endian = ""; |
|---|
| 48 | |
|---|
| 49 | # |
|---|
| 50 | # ²òŒá€Ç€€ë¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€Î¥Æ¡Œ¥Ö¥ë |
|---|
| 51 | # |
|---|
| 52 | %directives = ( |
|---|
| 53 | "long", "", |
|---|
| 54 | "dword", "", |
|---|
| 55 | "word", "", |
|---|
| 56 | "hword", "", |
|---|
| 57 | "int", "", |
|---|
| 58 | "short", "", |
|---|
| 59 | "half", "", |
|---|
| 60 | "byte", "", |
|---|
| 61 | "value", "", |
|---|
| 62 | "uaword", "", |
|---|
| 63 | "uashort", "", |
|---|
| 64 | "data32", 4, |
|---|
| 65 | "data16", 2, |
|---|
| 66 | "data8", 1, |
|---|
| 67 | "zero", -1, |
|---|
| 68 | "space", -1, |
|---|
| 69 | "globl", 0, |
|---|
| 70 | "global", 0, |
|---|
| 71 | "align", 0, |
|---|
| 72 | "p2align", 0, |
|---|
| 73 | "even", 0, |
|---|
| 74 | "data", 0, |
|---|
| 75 | "stabs", 0, |
|---|
| 76 | "type", 0, |
|---|
| 77 | "size", 0, |
|---|
| 78 | "section", 0, |
|---|
| 79 | "sdata", 0, |
|---|
| 80 | "code", 0, |
|---|
| 81 | ); |
|---|
| 82 | |
|---|
| 83 | # |
|---|
| 84 | # ¥ª¥Õ¥»¥Ã¥ÈÃ̀ΜÐÎÏ |
|---|
| 85 | # |
|---|
| 86 | sub parse_offset { |
|---|
| 87 | my($label, $val) = @_; |
|---|
| 88 | |
|---|
| 89 | printf "#define %s\t%d\n",$label,$val; |
|---|
| 90 | } |
|---|
| 91 | |
|---|
| 92 | # |
|---|
| 93 | # ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€ÎÆÉ€ßŒè€ê |
|---|
| 94 | # |
|---|
| 95 | sub ref_bit { |
|---|
| 96 | my($size) = @_; |
|---|
| 97 | my($dir, $directive); |
|---|
| 98 | |
|---|
| 99 | while ($line = <INFILE>) { |
|---|
| 100 | chomp $line; |
|---|
| 101 | next if ($line =~ /^[ \t]*[#;].*$/); |
|---|
| 102 | |
|---|
| 103 | if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/ |
|---|
| 104 | && defined($dir = $directives{$1})) { |
|---|
| 105 | $directive = $1; |
|---|
| 106 | if ($dir eq "") { |
|---|
| 107 | # ÅÐÏ¿€¹€Ù€¥Ç¥£¥ì¥¯¥Æ¥£¥Ö |
|---|
| 108 | $directives{$directive} = $size; |
|---|
| 109 | } |
|---|
| 110 | last; |
|---|
| 111 | } |
|---|
| 112 | else { |
|---|
| 113 | # ²òÀπǀ€Ê€€¹Ô |
|---|
| 114 | print STDERR "genoffset: cannot parse: $line\n"; |
|---|
| 115 | $error = 1; |
|---|
| 116 | } |
|---|
| 117 | } |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | # |
|---|
| 121 | # ¥Ó¥Ã¥È¥µ¡Œ¥Á |
|---|
| 122 | # |
|---|
| 123 | sub search_bit { |
|---|
| 124 | my($val) = @_; |
|---|
| 125 | my($val_bit); |
|---|
| 126 | |
|---|
| 127 | return(-1) if ($val == 0); |
|---|
| 128 | |
|---|
| 129 | $val_bit = 0; |
|---|
| 130 | while (($val & 1) == 0) { |
|---|
| 131 | $val >>= 1; |
|---|
| 132 | $val_bit++; |
|---|
| 133 | } |
|---|
| 134 | return($val_bit); |
|---|
| 135 | } |
|---|
| 136 | |
|---|
| 137 | # |
|---|
| 138 | # ¥Ó¥Ã¥È°ÌÃրΜÐÎÏ |
|---|
| 139 | # |
|---|
| 140 | sub parse_bit { |
|---|
| 141 | my($endian, $size, $label) = @_; |
|---|
| 142 | my($offset, $dir, $val, $val_bit); |
|---|
| 143 | |
|---|
| 144 | if ($sil_endian && $endian ne $sil_endian) { |
|---|
| 145 | # ¥š¥ó¥Ç¥£¥¢¥ó€ÎÉÔ°ìÃ× |
|---|
| 146 | print STDERR "genoffset: endian mismatch: $line\n"; |
|---|
| 147 | $error = 1; |
|---|
| 148 | } |
|---|
| 149 | |
|---|
| 150 | $offset = 0; |
|---|
| 151 | while ($line = <INFILE>) { |
|---|
| 152 | chomp $line; |
|---|
| 153 | next if ($line =~ /^[ \t]*[#;].*$/); |
|---|
| 154 | |
|---|
| 155 | if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/ |
|---|
| 156 | && defined($dir = $directives{$1})) { |
|---|
| 157 | $val = $2; |
|---|
| 158 | |
|---|
| 159 | # 16¿Ê¿ô€È8¿Ê¿ô€Î¿ôÃ̀؀ÎÊÑŽ¹œèÍý |
|---|
| 160 | if ($val =~ /^0x(.+)$/) { |
|---|
| 161 | $val = hex($1); |
|---|
| 162 | } |
|---|
| 163 | elsif ($val =~ /^0(.+)$/) { |
|---|
| 164 | $val = oct($1); |
|---|
| 165 | } |
|---|
| 166 | |
|---|
| 167 | if ($dir eq "") { |
|---|
| 168 | # ¥µ¥€¥º€òÃ΀é€Ê€€¥Ç¥£¥ì¥¯¥Æ¥£¥Ö |
|---|
| 169 | print STDERR "genoffset: unknown directive: $line\n"; |
|---|
| 170 | $error = 1; |
|---|
| 171 | } |
|---|
| 172 | elsif ($dir == 0) { |
|---|
| 173 | # ÆÉ€ßÈô€Ð€¹€Ù€¥Ç¥£¥ì¥¯¥Æ¥£¥Ö |
|---|
| 174 | } |
|---|
| 175 | elsif ($dir == -1) { |
|---|
| 176 | # .zero¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€ÎœèÍý |
|---|
| 177 | $offset += $val; |
|---|
| 178 | } |
|---|
| 179 | elsif ($val == 0) { |
|---|
| 180 | # ÃÍ€¬0€Î¥Õ¥£¡Œ¥ë¥É€ÎœèÍý |
|---|
| 181 | $offset += $dir; |
|---|
| 182 | } |
|---|
| 183 | else { |
|---|
| 184 | # ÃÍ€¬0€Ç€Ê€€¥Õ¥£¡Œ¥ë¥É€¬ž«€Ä€«€ì€Ð¥ë¡Œ¥×€òœªÎ» |
|---|
| 185 | last; |
|---|
| 186 | } |
|---|
| 187 | } |
|---|
| 188 | else { |
|---|
| 189 | # ²òÀπǀ€Ê€€¹Ô |
|---|
| 190 | print STDERR "genoffset: cannot parse: $line\n"; |
|---|
| 191 | $error = 1; |
|---|
| 192 | } |
|---|
| 193 | } |
|---|
| 194 | |
|---|
| 195 | # ¥Ó¥Ã¥È°ÌÃÖ€òõ€¹ |
|---|
| 196 | $val_bit = search_bit($val); |
|---|
| 197 | |
|---|
| 198 | # ¥Ð¥€¥Èñ°Ì€Ë޹»»€¹€ë |
|---|
| 199 | if ($endian eq "B") { |
|---|
| 200 | $offset += $dir - 1; |
|---|
| 201 | $offset -= $val_bit >> 3; |
|---|
| 202 | } |
|---|
| 203 | else { |
|---|
| 204 | $offset += $val_bit >> 3; |
|---|
| 205 | } |
|---|
| 206 | $val_bit &= 0x07; |
|---|
| 207 | |
|---|
| 208 | # œÐÎÏñ°Ì€Ë޹»»€¹€ë |
|---|
| 209 | if ($size eq "W") { |
|---|
| 210 | if ($endian eq "B") { |
|---|
| 211 | $val_bit += 24; |
|---|
| 212 | $val_bit -= ($offset & 0x03) << 3; |
|---|
| 213 | } |
|---|
| 214 | else { |
|---|
| 215 | $val_bit += ($offset & 0x03) << 3; |
|---|
| 216 | } |
|---|
| 217 | $offset &= ~0x03; |
|---|
| 218 | } |
|---|
| 219 | elsif ($size eq "H") { |
|---|
| 220 | if ($endian eq "B") { |
|---|
| 221 | $val_bit += 8; |
|---|
| 222 | $val_bit -= ($offset & 0x01) << 3; |
|---|
| 223 | } |
|---|
| 224 | else { |
|---|
| 225 | $val_bit += ($offset & 0x01) << 3; |
|---|
| 226 | } |
|---|
| 227 | $offset &= ~0x01; |
|---|
| 228 | } |
|---|
| 229 | |
|---|
| 230 | # ÄêµÁ€ÎœÐÎÏ |
|---|
| 231 | $label =~ s/^_//; |
|---|
| 232 | printf "#define %s\t%d\n",$label,$offset; |
|---|
| 233 | printf "#define %s_bit\t%d\n",$label,$val_bit; |
|---|
| 234 | printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit); |
|---|
| 235 | } |
|---|
| 236 | |
|---|
| 237 | # |
|---|
| 238 | # ¥á¥€¥ó¥ë¡Œ¥Á¥ó |
|---|
| 239 | # |
|---|
| 240 | print "/* This file is generated by genoffset. */\n"; |
|---|
| 241 | print "\n"; |
|---|
| 242 | |
|---|
| 243 | $error = 0; |
|---|
| 244 | open(INFILE, $infile) || die "Cannot open $infile"; |
|---|
| 245 | while ($line = <INFILE>) { |
|---|
| 246 | chomp $line; |
|---|
| 247 | |
|---|
| 248 | if ($line =~ /^[ \t]*OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) { |
|---|
| 249 | parse_offset($1, $2); |
|---|
| 250 | } |
|---|
| 251 | elsif ($line =~ /^[ \t]*_?BIT_REF_([0-9]+):/) { |
|---|
| 252 | ref_bit($1); |
|---|
| 253 | } |
|---|
| 254 | elsif ($line =~ /^[ \t]*SIL_ENDIAN = ([BL])/) { |
|---|
| 255 | $sil_endian = $1; |
|---|
| 256 | } |
|---|
| 257 | } |
|---|
| 258 | # |
|---|
| 259 | # ¥³¥ó¥Ñ¥€¥é€¬¥°¥í¡Œ¥Ð¥ëÊÑ¿ô€ÎÇÛÃÖœçœø€òÊѹ¹€¹€ë€È¡€BIT_REF_?€¬²Œ€Ë€Ê |
|---|
| 260 | # €ë²ÄÇœÀ€¬€¢€ë€¿€á¡€Æ¬€«€éÆÉ€ßÄŸ€¹¡¥ |
|---|
| 261 | # |
|---|
| 262 | seek(INFILE, 0, SEEK_SET); |
|---|
| 263 | while ($line = <INFILE>) { |
|---|
| 264 | chomp $line; |
|---|
| 265 | |
|---|
| 266 | if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) { |
|---|
| 267 | parse_bit($1, $2, $3); |
|---|
| 268 | } |
|---|
| 269 | } |
|---|
| 270 | close(INFILE); |
|---|
| 271 | exit($error); |
|---|