annotate generate_context.pl @ 1:9a4279c88aa7 default tip

copy from xv6 repository
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 06 Mar 2020 14:59:59 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #!/usr/bin/perl
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 use Getopt::Std;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 use strict;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 # generrate Gears OS context heaader and initializer from CbC sources
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 # CodeGear
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 # get stub information from # *.c
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 # __code taskManager_stub(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 # generate CodeGear indexn in context.h
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 # C_taskManager,
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 # generate CodeGear stub reference in context.h
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 # extern __code taskManager_stub(struct Context*);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 # generate CodeGear stub reference in $name-context.h for each module
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 # cbc_context->code[C_taskManager] = taskManager_stub;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 # DataGear
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 # get DataGear information from context.h
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 # struct Worker {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 # int id;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 # struct Context* contexts;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 # enum Code execute;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 # enum Code taskSend;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 # enum Code taskRecive;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 # enum Code shutdown;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 # struct Queue* tasks;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 # } Worker;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 # generate typedefs and DataGear index in context.h
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 # typedef struct Worker Worker;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 # D_Worker,
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 # generate DataGear allocator in context.h
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 # ALLOC_DATA(context, Worker);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 #
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 my $ddir = "c";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 our($opt_o,$opt_d,$opt_h,$opt_w);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 getopts('o:d:hw');
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 my $name = $opt_o?$opt_o:"gears";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 if ($opt_d) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 $ddir = $opt_d;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 if ( ! -d $ddir) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 mkdir $ddir;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 if ($opt_h) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 print "$0 [-d distdir] [-h]\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 exit;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 my %codeGear;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 my %dataGear;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 my %constructor;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 use FindBin;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 use lib "$FindBin::Bin/lib";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 use File::Spec;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 use Cwd 'getcwd';
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 use Gears::Context;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 use Getopt::Std;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 my $output = $opt_w ? "context.h" : "stdout";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 use Data::Dumper;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 my @cbc_files;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 map { push(@cbc_files,File::Spec->rel2abs($_)); } @ARGV;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 my $gears = Gears::Context->new(compile_sources => \@cbc_files, find_root => "$FindBin::Bin/../", output => $output);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 my $data_gears = $gears->extraction_dg_compile_sources($gears->{compile_sources});
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 my $g = $gears->set_data_gear_header_path(keys %{$data_gears->{impl}},keys %{$data_gears->{interfaces}});
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 my $dg2path = $gears->update_dg_each_header_path($data_gears,$g);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 my $tree = $gears->createImplTree_from_header($dg2path);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 $gears->tree2create_context_h($tree);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 # gather module Information for code table initialization
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 for (@ARGV) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 next if (/context.c/);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 &getStubInfo($_);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 my (%mCodeGear) = (%codeGear);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 # anyway we gather all Gears Information
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 while (<*.c test/*.c>) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 next if (/context.c/);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 &getStubInfo($_);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 &generateContext();
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 sub getStubInfo {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 my ($filename) = @_;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 open my $fd,"<",$filename or die("can't open $filename $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 while (<$fd>) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 if (/^__code (\w+)_stub\(struct *Context *\* *cbc_context\)/) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 $codeGear{$1} = $filename;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 } elsif (/^(\w+)(\*)+ *create(\w+)\(([^]]*)\)/) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 my $interface = $1;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 my $implementation = $3;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 my $constructorArgs = $4;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 $constructor{$implementation} = [$interface, $constructorArgs];
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 open my $cx,"<","context.h" or die("can't open context.h $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 my $inUnionData = 0;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 while (<$cx>) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 if (! $inUnionData) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 if ( /^union Data/) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 $inUnionData = 1;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 next;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 last if (/union Data end/);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 if (/struct (\w+) \{/) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 $dataGear{$1} = 'struct';
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 } elsif (/^\s{4}(\w+) (\w+);/) { # primitive type
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 my $vtype = $1;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 my $vname = $2;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 if (exists $dataGear{$vname}) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 next;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 $dataGear{$vtype} = 'primitive';
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 $dataGear{"Context"} = "struct";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 sub generateContext {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 $codeGear{"start_code"} = "$ddir/$name-context.c";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 $codeGear{"exit_code"} = "$ddir/$name-context.c";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 $mCodeGear{"start_code"} = "$ddir/$name-context.c";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 $mCodeGear{"exit_code"} = "$ddir/$name-context.c";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 open my $fd,">","$ddir/extern.h" or die("can't open $ddir/extern.h $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 for my $code ( sort keys %codeGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 print $fd "extern __code ${code}_stub(struct Context*);\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 for my $impl ( sort keys %constructor ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 my ($interface, $constructorArgs) = @{$constructor{$impl}};
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 print $fd "extern ${interface}* create${impl}($constructorArgs);\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 print $fd "\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 open my $fd,">","$ddir/enumCode.h" or die("can't open $ddir/enumCode.h $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 print $fd "enum Code {\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 for my $code ( sort keys %codeGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 print $fd " C_${code},\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 print $fd "};\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 my $code_init = '';
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 for my $code ( sort keys %mCodeGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 $code_init .= " cbc_context->code[C_${code}] = ${code}_stub;\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 my $data_num = keys(%dataGear);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 $data_num++;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 my $context_c = << "EOFEOF";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 #ifndef CBCXV6
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 #include <stdlib.h>
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 #endif
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 #include "../context.h"
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 void initContext(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 cbc_context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 cbc_context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 cbc_context->data = NEWN(ALLOCATE_SIZE, union Data*);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 cbc_context->heapStart = NEWN(cbc_context->heapLimit, char);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 cbc_context->heap = cbc_context->heapStart;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 // cbc_context->codeNum = Exit;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 $code_init
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 #include "dataGearInit.c"
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 cbc_context->dataNum = $data_num;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 EOFEOF
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 open my $fd,">","$ddir/$name-context.c" or die("can't open $ddir/$name-context.c $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 print $fd $context_c;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 my $meta_call = <<"EOFEOF";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 __code meta(struct Context* cbc_context, enum Code next) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 // printf("meta %d\\n",next);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 goto (cbc_context->code[next])(cbc_context);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 __code parGotoMeta(struct Context* cbc_context, enum Code next) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 cbc_context->task = NULL;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 cbc_context->taskList = NULL;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 goto (cbc_context->code[Gearef(cbc_context, TaskManager)->taskManager->TaskManager.spawnTasks])(cbc_context);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 __code start_code(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 goto meta(cbc_context, cbc_context->next);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 __code start_code_stub(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 goto start_code(cbc_context);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 __code exit_code(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 // free(cbc_context->code);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 // free(cbc_context->data);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 // free(cbc_context->heapStart);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 goto exit_code(cbc_context);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 __code exit_code_stub(struct Context* cbc_context) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 goto exit_code(cbc_context);
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 // end context_c
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 EOFEOF
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 print $fd $meta_call;
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 open my $fd,">","$ddir/enumData.h" or die("can't open $ddir/enumData.h $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 print $fd "enum DataType {\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 print $fd " D_Code,\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 for my $data ( sort keys %dataGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 print $fd " D_${data},\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 print $fd "};\n\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 open my $fd,">","$ddir/typedefData.h" or die("can't open $ddir/typedefData.h $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 for my $data ( sort keys %dataGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 if ($dataGear{$data} eq 'struct') {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 print $fd "typedef struct ${data} ${data};\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 open my $fd,">","$ddir/dataGearInit.c" or die("can't open $ddir/dataGearInit.c $!");
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 for my $data ( sort keys %dataGear ) {
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 print $fd " ALLOC_DATA(cbc_context, ${data});\n";
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 }
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
9a4279c88aa7 copy from xv6 repository
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 # end