f53480b2cf72d630f8f86f982b0a23101122ccc6
[mes.git] / lib / libc+tcc-gcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <setjmp.h>
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <time.h>
27 #include <signal.h>
28 #include <sys/mman.h>
29 #include <sys/time.h>
30 #include <unistd.h>
31
32 #include <libc-gcc.c>
33 #include <linux+tcc-gcc.c>
34 #include <libc+tcc.c>
35 #include <getopt.c>
36
37 #if !POSIX
38
39 int errno;
40
41 void
42 longjmp (jmp_buf env, int val)
43 {
44   val = val == 0 ? 1 : val;
45   asm ("mov    0xc(%ebp),%eax\n\t"     // val
46        "mov    0x8(%ebp),%ebp\n\t"     // env*
47
48        "mov    0x4(%ebp),%ebx\n\t"     // env->__pc
49        "mov    0x8(%ebp),%esp\n\t"     // env->__sp
50        "mov    0x0(%ebp),%ebp\n\t"     // env->__bp
51        "jmp    *%ebx\n\t"              // jmp *PC
52        );
53   // not reached
54   exit (42);
55 }
56
57 #if 0
58 int
59 setjmp_debug (jmp_buf env, int val)
60 {
61   int i;
62 #if 1
63   i = env->__bp;
64   i = env->__pc;
65   i = env->__sp;
66 #else
67   i = env[0].__bp;
68   i = env[0].__pc;
69   i = env[0].__sp;
70 #endif
71   return val == 0 ? 1 : val;
72 }
73 #endif
74
75 int
76 setjmp (jmp_buf env)
77 {
78   int *p = (int*)&env;
79   env[0].__bp = p[-2];
80   env[0].__pc = p[-1];
81   env[0].__sp = (int)&env;
82   return 0;
83 }
84
85 unsigned long long
86 __udivdi3 (unsigned long long a, unsigned long long b)
87 {
88   int ai = a;
89   int bi = b;
90   return ai / bi;
91 }
92
93 unsigned long long
94 __umoddi3 (unsigned long long a, unsigned long long b)
95 {
96   int ai = a;
97   int bi = b;
98   return ai % bi;
99 }
100
101 unsigned long long
102 __lshrdi3 (unsigned long long a, int b)
103 {
104   return a >> b;
105 }
106
107 long long
108 __ashldi3 (long long a, int b)
109 {
110   return a << b;
111 }
112
113 long long
114 __ashrdi3 (long long a, int b)
115 {
116   return a >> b;
117 }
118
119 long double
120 __floatundixf (unsigned long long a)
121 {
122   eputs ("__floatundix stub\n");
123   return 0;
124 }
125
126 unsigned long long
127 __fixunsxfdi (double a1)
128 {
129   eputs ("__fixunsxfdi stub\n");
130   return 0;
131 }
132
133 unsigned long long
134 __fixdfdi (double a1)
135 {
136   eputs ("__fixdfdi stub\n");
137   return 0;
138 }
139
140 unsigned long long
141 __fixxfdi (double a1)
142 {
143   eputs ("__fixxfdi stub\n");
144   return 0;
145 }
146
147 unsigned long long
148 __fixsfdi (double a1)
149 {
150   eputs ("__fixsfdi stub\n");
151   return 0;
152 }
153
154 #include <m4.c>
155
156 #endif // !POSIX