1*411dcbecSplunky /* Id */
2*411dcbecSplunky /* $NetBSD: prog_cpp.c,v 1.1.1.1 2016/02/09 20:29:13 plunky Exp $ */
3*411dcbecSplunky
4*411dcbecSplunky /*-
5*411dcbecSplunky * Copyright (c) 2014 Iain Hibbert.
6*411dcbecSplunky *
7*411dcbecSplunky * Permission is hereby granted, free of charge, to any person obtaining a copy
8*411dcbecSplunky * of this software and associated documentation files (the "Software"), to deal
9*411dcbecSplunky * in the Software without restriction, including without limitation the rights
10*411dcbecSplunky * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11*411dcbecSplunky * copies of the Software, and to permit persons to whom the Software is
12*411dcbecSplunky * furnished to do so, subject to the following conditions:
13*411dcbecSplunky *
14*411dcbecSplunky * The above copyright notice and this permission notice shall be included in
15*411dcbecSplunky * all copies or substantial portions of the Software.
16*411dcbecSplunky *
17*411dcbecSplunky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18*411dcbecSplunky * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*411dcbecSplunky * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20*411dcbecSplunky * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21*411dcbecSplunky * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22*411dcbecSplunky * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23*411dcbecSplunky * THE SOFTWARE.
24*411dcbecSplunky */
25*411dcbecSplunky
26*411dcbecSplunky #include "driver.h"
27*411dcbecSplunky
JUNK(void)28*411dcbecSplunky static void JUNK(void)
29*411dcbecSplunky {
30*411dcbecSplunky // __LITTLE_ENDIAN__
31*411dcbecSplunky // __BIG_ENDIAN__
32*411dcbecSplunky
33*411dcbecSplunky /* Machine specific macros */
34*411dcbecSplunky switch (targmach) {
35*411dcbecSplunky case mach_amd64:
36*411dcbecSplunky list_add(l, "-D__amd64__");
37*411dcbecSplunky list_add(l, "-D__amd64");
38*411dcbecSplunky list_add(l, "-D__x86_64__");
39*411dcbecSplunky list_add(l, "-D__x86_64");
40*411dcbecSplunky list_add(l, "-D__LP64__");
41*411dcbecSplunky list_add(l, "-D_LP64");
42*411dcbecSplunky break;
43*411dcbecSplunky
44*411dcbecSplunky case mach_arm:
45*411dcbecSplunky list_add(l, "-D__arm__");
46*411dcbecSplunky break;
47*411dcbecSplunky
48*411dcbecSplunky case mach_i386:
49*411dcbecSplunky list_add(l, "-D__i386__");
50*411dcbecSplunky list_add(l, "-D__i386");
51*411dcbecSplunky break;
52*411dcbecSplunky
53*411dcbecSplunky case mach_nova:
54*411dcbecSplunky list_add(l, "-D__nova__");
55*411dcbecSplunky break;
56*411dcbecSplunky
57*411dcbecSplunky case mach_m16c:
58*411dcbecSplunky list_add(l, "-D__m16c__");
59*411dcbecSplunky break;
60*411dcbecSplunky
61*411dcbecSplunky case mach_mips:
62*411dcbecSplunky list_add(l, "-D__mips__");
63*411dcbecSplunky break;
64*411dcbecSplunky
65*411dcbecSplunky case mach_pdp10:
66*411dcbecSplunky list_add(l, "-D__pdp10__");
67*411dcbecSplunky break;
68*411dcbecSplunky
69*411dcbecSplunky case mach_pdp11:
70*411dcbecSplunky list_add(l, "-D__pdp11__");
71*411dcbecSplunky break;
72*411dcbecSplunky
73*411dcbecSplunky case mach_powerpc:
74*411dcbecSplunky list_add(l, "-D__powerpc__");
75*411dcbecSplunky list_add(l, "-D__ppc__");
76*411dcbecSplunky break;
77*411dcbecSplunky
78*411dcbecSplunky case mach_sparc:
79*411dcbecSplunky list_add(l, "-D__sparc__");
80*411dcbecSplunky list_add(l, "-D__sparc");
81*411dcbecSplunky break;
82*411dcbecSplunky
83*411dcbecSplunky case mach_sparc64:
84*411dcbecSplunky list_add(l, "-D__sparc64__");
85*411dcbecSplunky list_add(l, "-D__sparc_v9__");
86*411dcbecSplunky list_add(l, "-D__sparcv9");
87*411dcbecSplunky list_add(l, "-D__sparc__");
88*411dcbecSplunky list_add(l, "-D__sparc");
89*411dcbecSplunky list_add(l, "-D__LP64__");
90*411dcbecSplunky list_add(l, "-D_LP64");
91*411dcbecSplunky break;
92*411dcbecSplunky
93*411dcbecSplunky case mach_vax:
94*411dcbecSplunky list_add(l, "-D__vax__");
95*411dcbecSplunky break;
96*411dcbecSplunky }
97*411dcbecSplunky }
98*411dcbecSplunky
99*411dcbecSplunky static void
cpp_add_stddef(struct list * l)100*411dcbecSplunky cpp_add_stddef(struct list *l)
101*411dcbecSplunky {
102*411dcbecSplunky
103*411dcbecSplunky /* STDC */
104*411dcbecSplunky list_add(l, "-D__STDC__=1");
105*411dcbecSplunky list_add(l, "-D__STDC_HOSTED__=%d", opt.hosted ? 1 : 0);
106*411dcbecSplunky list_add(l, "-D__STDC_VERSION_=199901L");
107*411dcbecSplunky list_add(l, "-D__STDC_ISO_10646__=200009L");
108*411dcbecSplunky
109*411dcbecSplunky /* PCC specific */
110*411dcbecSplunky list_add(l, "-D__PCC__=%d", PCC_MAJOR);
111*411dcbecSplunky list_add(l, "-D__PCC_MINOR__=%d", PCC_MINOR);
112*411dcbecSplunky list_add(l, "-D__PCC_MINORMINOR__=%d", PCC_MINORMINOR);
113*411dcbecSplunky list_add(l, "-D__VERSION__=\"%s\"", VERSSTR);
114*411dcbecSplunky
115*411dcbecSplunky /* GNU C compat */
116*411dcbecSplunky if (opt.gnu89 || opt.gnu99) {
117*411dcbecSplunky list_add(l, "-D__GNUC__=4");
118*411dcbecSplunky list_add(l, "-D__GNUC_MINOR__=3");
119*411dcbecSplunky list_add(l, "-D__GNUC_PATCHLEVEL__=1");
120*411dcbecSplunky list_add(l, "-D__GNUC_%s_INLINE__", opt.gnu89 ? "GNU" : "STDC");
121*411dcbecSplunky }
122*411dcbecSplunky
123*411dcbecSplunky /* language specific */
124*411dcbecSplunky if (strcmp(infile->next, "I")
125*411dcbecSplunky list_add(l, "-D__cplusplus");
126*411dcbecSplunky if (strcmp(infile->next, "f")
127*411dcbecSplunky list_add(l, "-D__FORTRAN__");
128*411dcbecSplunky if (strcmp(infile->next, "s")
129*411dcbecSplunky list_add(l, "-D__ASSEMBLER__");
130*411dcbecSplunky
131*411dcbecSplunky /* runtime options */
132*411dcbecSplunky if (opt.optim > 0)
133*411dcbecSplunky list_add(l, "-D__OPTIMIZE__");
134*411dcbecSplunky if (opt.ssp > 0)
135*411dcbecSplunky list_add(l, "-D__SSP__");
136*411dcbecSplunky if (opt.pthread)
137*411dcbecSplunky list_add(l, "-D_PTHREADS");
138*411dcbecSplunky if (opt.uchar)
139*411dcbecSplunky list_add(l, "-D__CHAR_UNSIGNED__");
140*411dcbecSplunky
141*411dcbecSplunky /* target specific definitions */
142*411dcbecSplunky list_add_array(l, target_defs);
143*411dcbecSplunky }
144*411dcbecSplunky
145*411dcbecSplunky static int
146*411dcbecSplunky cpp_exec(const char *infile, const char *outfile)
147*411dcbecSplunky {
148*411dcbecSplunky list_t *l;
149*411dcbecSplunky const char *file;
150*411dcbecSplunky int rv;
151*411dcbecSplunky
152*411dcbecSplunky if (prog_cpp == NULL)
153*411dcbecSplunky error("No preprocessor is defined");
154*411dcbecSplunky
155*411dcbecSplunky l = list_alloc();
156*411dcbecSplunky
157*411dcbecSplunky list_add_file(l, prog_cpp, &progdirs, X_OK);
158*411dcbecSplunky
159*411dcbecSplunky for (int i = 0; i < opt.C; i++)
160*411dcbecSplunky list_add(l, "-C");
161*411dcbecSplunky if (opt.M)
162*411dcbecSplunky list_add(l, "-M");
163*411dcbecSplunky if (opt.P)
164*411dcbecSplunky list_add(l, "-P");
165*411dcbecSplunky if (opt.traditional)
166*411dcbecSplunky list_add(l, "-t");
167*411dcbecSplunky if (opt.verbose)
168*411dcbecSplunky list_add(l, "-v");
169*411dcbecSplunky
170*411dcbecSplunky Wflag_add(l, W_CPP);
171*411dcbecSplunky
172*411dcbecSplunky if (opt.stddefs)
173*411dcbecSplunky cpp_add_stddef(l);
174*411dcbecSplunky
175*411dcbecSplunky list_add_list(l, opt.DIU);
176*411dcbecSplunky
177*411dcbecSplunky list_add_list(l, opt.Wp);
178*411dcbecSplunky
179*411dcbecSplunky if (infile != NULL)
180*411dcbecSplunky list_add(l, infile);
181*411dcbecSplunky else if (outfile != NULL)
182*411dcbecSplunky list_add(l, "-");
183*411dcbecSplunky
184*411dcbecSplunky if (outfile != NULL)
185*411dcbecSplunky list_add(l, outfile);
186*411dcbecSplunky
187*411dcbecSplunky rv = list_exec(l);
188*411dcbecSplunky list_free(l);
189*411dcbecSplunky return rv;
190*411dcbecSplunky }
191