-
Notifications
You must be signed in to change notification settings - Fork 54
/
README.lcc
167 lines (138 loc) · 4.38 KB
/
README.lcc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
This file documents how to use lcc 4.1 as the C compiler when
installing Mercury on Linux.
Some of the same issues may arise when using lcc on other systems,
or when using other versions of lcc.
1. You can get lcc from <http://www.cs.princeton.edu/software/lcc/>.
In particular Linux RPM's are available from
<ftp://ftp.cs.princeton.edu/pub/packages/lcc/contrib>.
2. Apply the following patches:
(i) On at least some versions of Linux, the following patch must be
applied to /usr/include/stdint.h. This is because the Boehm (et al)
collector uses elf.h, and the version of elf.h that gets installed on
Linux uses by default is not compatible with lcc -- it uses
typedefs defined as `long long' in stdint.h.
If you prefer you can copy stdint.h to /usr/local/lib/lcc-4.1/include
and then apply the patch there.
This should be fixed in newer versions of glibc.
--- /usr/include/stdint.h Sun Nov 7 03:23:27 1999
+++ ./stdint.h Tue Nov 21 05:25:39 2000
@@ -28,6 +28,22 @@
#include <stddef.h>
#include <bits/wordsize.h>
+#ifdef __GNUC__
+__extension__
+typedef long long __long_long;
+__extension__
+typedef unsigned long long __u_long_long;
+#else
+typedef struct {
+ long __ll_first;
+ long __ll_second;
+} __long_long;
+typedef struct {
+ unsigned long __ull_first;
+ unsigned long __ull_second;
+} __u_long_long;
+#endif
+
/* Exact integral types. */
/* Signed. */
@@ -42,8 +58,10 @@
typedef long int int64_t;
# else
__extension__
-typedef long long int int64_t;
+typedef __long_long int64_t;
# endif
+#else
+typedef __long_long int64_t;
#endif
/* Unsigned. */
@@ -54,7 +72,7 @@
typedef unsigned long int uint64_t;
#else
__extension__
-typedef unsigned long long int uint64_t;
+typedef __u_long_long uint64_t;
#endif
@@ -68,7 +86,7 @@
typedef long int int_least64_t;
#else
__extension__
-typedef long long int int_least64_t;
+typedef __long_long int_least64_t;
#endif
/* Unsigned. */
@@ -79,7 +97,7 @@
typedef unsigned long int uint_least64_t;
#else
__extension__
-typedef unsigned long long int uint_least64_t;
+typedef __u_long_long uint_least64_t;
#endif
@@ -95,7 +113,7 @@
typedef int int_fast16_t;
typedef int int_fast32_t;
__extension__
-typedef long long int int_fast64_t;
+typedef __long_long int_fast64_t;
#endif
/* Unsigned. */
@@ -108,7 +126,7 @@
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
__extension__
-typedef unsigned long long int uint_fast64_t;
+typedef __u_long_long uint_fast64_t;
#endif
@@ -134,9 +152,9 @@
typedef unsigned long int uintmax_t;
#else
__extension__
-typedef long long int intmax_t;
+typedef __long_long intmax_t;
__extension__
-typedef unsigned long long int uintmax_t;
+typedef __u_long_long uintmax_t;
#endif
(ii) On some versions of Linux, the following patch must be
applied to /usr/local/lib/lcc-4.1/include/stdio.h.
This is due to an incompatibility between glibc's <sys/types.h>
and lcc's <stdio.h>.
--- stdio.h.orig Thu Jul 6 10:12:07 2000
+++ stdio.h Sun Feb 4 18:33:46 2001
@@ -444,18 +444,20 @@
are originally defined in the Large File Support API. */
/* Types needed in these functions. */
-#ifndef off_t
+#if !defined off_t && !defined __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define off_t off_t
+# define __off_t_defined
#endif
-#if defined __USE_LARGEFILE64 && !defined off64_t
+#if defined __USE_LARGEFILE64 && !defined off64_t && !defined __off64_t_defined
typedef __off64_t off64_t;
# define off64_t off64_t
+# define __off64_t_defined
#endif
(iii) lcc 4.1 on at least some versions of Linux has a bug where
`lcc -static' is broken. To work around that, rename the
original `lcc' program as `lcc.orig' and replace it with the
following script:
#!/bin/sh
lcc.orig "$@" -lc -lgcc
This results in some spurious warnings when invoking `lcc -c ...',
but ensures that `lcc -static ...' works.
3. When invoking `configure', use the `--with-cc=lcc' option.
4. If you run into a fixed limit with lcc, it might be necessary
to pass the `--max-jump-table-size' to mmc, e.g. by putting
`EXTRA_MCFLAGS=--max-jump-table-size 100' in Mmake.params.
This requires recompiling the Mercury sources to C,
so you need to have a working Mercury compiler already installed
(e.g. one built using gcc instead of lcc).
5. Otherwise, follow the normal installation instructions in the INSTALL file.