1 /* --------------------------------------------------------------------------
2 * Connections between components of the Hugs system
4 * The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the
5 * Yale Haskell Group, and the Oregon Graduate Institute of Science and
6 * Technology, 1994-1999, All rights reserved. It is distributed as
7 * free software under the license in the file "License", which is
8 * included in the distribution.
10 * $RCSfile: connect.h,v $
12 * $Date: 2000/03/10 14:53:00 $
13 * ------------------------------------------------------------------------*/
15 /* --------------------------------------------------------------------------
17 * ------------------------------------------------------------------------*/
19 extern Bool haskell98; /* TRUE => Haskell 98 compatibility*/
20 extern Bool combined; /* TRUE => combined operation */
21 extern Module modulePrelude;
23 /* --------------------------------------------------------------------------
24 * Primitive constructor functions
25 * ------------------------------------------------------------------------*/
27 extern Name nameFalse, nameTrue;
28 extern Name nameNil, nameCons;
29 extern Name nameJust, nameNothing;
30 extern Name nameLeft, nameRight;
33 extern Name nameLT, nameEQ;
35 extern Name nameFst, nameSnd; /* standard combinators */
36 extern Name nameId, nameOtherwise;
37 extern Name nameNegate, nameFlip; /* primitives reqd for parsing */
38 extern Name nameFrom, nameFromThen;
39 extern Name nameFromTo, nameFromThenTo;
40 extern Name nameFatbar, nameFail; /* primitives reqd for translation */
41 extern Name nameIf, nameSel;
42 extern Name nameCompAux;
43 extern Name namePmInt, namePmFlt; /* primitives for pattern matching */
44 extern Name namePmInteger;
45 extern Name namePmNpk, namePmSub; /* primitives for (n+k) patterns */
46 extern Name nameError; /* For runtime error messages */
47 extern Name nameUndefined; /* A generic undefined value */
48 extern Name nameBlackHole; /* For GC-detected black hole */
49 extern Name nameInd; /* For dict indirection */
50 extern Name nameAnd, nameOr; /* For optimisation of && and || */
51 extern Name nameFromInt, nameFromDouble;/*coercion of numerics */
52 extern Name nameFromInteger;
53 extern Name nameEq, nameCompare; /* names used for deriving */
54 extern Name nameMinBnd, nameMaxBnd;
55 extern Name nameIndex, nameInRange;
56 extern Name nameRange;
57 extern Name nameLe, nameGt;
58 extern Name nameShowsPrec, nameReadsPrec;
59 extern Name nameMult, namePlus;
60 extern Name nameComp, nameApp; /* composition and append */
61 extern Name nameShowField; /* display single field */
62 extern Name nameShowParen; /* wrap with parens */
63 extern Name nameReadField; /* read single field */
64 extern Name nameReadParen; /* unwrap from parens */
65 extern Name nameLex; /* lexer */
66 extern Name nameRangeSize; /* calculate size of index range */
67 extern Class classMonad; /* Monads */
68 extern Name nameReturn, nameBind; /* for translating monad comps */
69 extern Name nameMFail;
70 extern Name nameListMonad; /* builder function for List Monad */
71 extern Name namePrint; /* printing primitive */
72 extern Name nameCreateAdjThunk; /* f-x-dyn: create adjustor thunk */
73 extern Text textPrelude;
74 extern Text textNum; /* used to process default decls */
75 extern Text textCcall; /* used to process foreign import */
76 extern Text textStdcall; /* ... and foreign export */
77 extern Text textPlus; /* Used to recognise n+k patterns */
80 extern Name nameNoRec; /* The empty record */
81 extern Type typeNoRow; /* The empty row */
82 extern Type typeRec; /* Record formation */
83 extern Kind extKind; /* Kind of extension, *->row->row */
84 extern Name nameRecExt; /* Extend a record */
85 extern Name nameRecBrk; /* Break a record */
86 extern Name nameAddEv; /* Addition of evidence values */
87 extern Name nameRecSel; /* Select a record */
88 extern Name nameRecShw; /* Show a record */
89 extern Name nameShowRecRow; /* Used to output rows */
90 extern Name nameRecEq; /* Compare records */
91 extern Name nameEqRecRow; /* Used to compare rows */
92 extern Name nameInsFld; /* Field insertion routine */
95 extern String repeatStr; /* Repeat last command string */
96 extern String hugsEdit; /* String for editor command */
97 extern String hugsPath; /* String for file search path */
98 extern String projectPath; /* String for project search path */
100 extern Type typeProgIO; /* For the IO monad, IO a */
101 extern Type typeArrow; /* Builtin type constructors */
102 extern Type typeList;
103 extern Type typeUnit;
105 #define fn(from,to) ap(ap(typeArrow,from),to) /* make type: from -> to */
107 extern List stdDefaults; /* List of standard default types */
109 extern Class classEq; /* `standard' classes */
110 extern Class classOrd;
111 extern Class classShow;
112 extern Class classRead;
113 extern Class classIx;
114 extern Class classEnum;
115 extern Class classBounded;
117 extern Class classReal; /* `numeric' classes */
118 extern Class classIntegral;
119 extern Class classRealFrac;
120 extern Class classRealFloat;
121 extern Class classFractional;
122 extern Class classFloating;
123 extern Class classNum;
125 extern Cell *CStackBase; /* pointer to base of C stack */
127 extern List tyconDefns; /* list of type constructor defns */
128 extern List typeInDefns; /* list of synonym restrictions */
129 extern List valDefns; /* list of value definitions */
130 extern List classDefns; /* list of class definitions */
131 extern List instDefns; /* list of instance definitions */
132 extern List selDefns; /* list of selector lists */
133 extern List genDefns; /* list of generated defns */
134 extern List primDefns; /* list of primitive definitions */
135 extern List unqualImports; /* unqualified import list */
136 extern List defaultDefns; /* default definitions (if any) */
137 extern Int defaultLine; /* line in which default defs occur*/
138 extern List evalDefaults; /* defaults for evaluator */
139 extern Cell inputExpr; /* evaluator input expression */
140 extern Cell inputContext; /* evaluator input expression */
141 extern Addr inputCode; /* Code for compiled input expr */
143 extern Int whnfArgs; /* number of args of term in whnf */
144 extern Cell whnfHead; /* head of term in whnf */
145 extern Int whnfInt; /* integer value of term in whnf */
146 extern Float whnfFloat; /* float value of term in whnf */
147 extern Long numCells; /* number of cells allocated */
148 extern Int numGcs; /* number of garbage collections */
149 extern Bool broken; /* indicates interrupt received */
150 extern Bool preludeLoaded; /* TRUE => prelude has been loaded */
152 extern Bool gcMessages; /* TRUE => print GC messages */
153 extern Bool literateScripts; /* TRUE => default lit scripts */
154 extern Bool literateErrors; /* TRUE => report errs in lit scrs */
155 extern Bool showInstRes; /* TRUE => show instance resolution */
157 extern Int cutoff; /* Constraint Cutoff depth */
160 extern String preprocessor; /* preprocessor command */
164 extern Bool debugCode; /* TRUE => print G-code to screen */
166 extern Bool debugSC; /* TRUE => print SC to screen */
167 extern Bool kindExpert; /* TRUE => display kind errors in */
169 extern Bool allowOverlap; /* TRUE => allow overlapping insts */
171 /* --------------------------------------------------------------------------
172 * Function prototypes etc...
173 * ------------------------------------------------------------------------*/
175 extern Void everybody Args((Int));
178 #define RESET 1 /* reset subsystem */
179 #define MARK 2 /* mark parts of graph in use by subsystem */
180 #define PREPREL 3 /* do startup actions before Prelude loading */
181 #define POSTPREL 4 /* do startup actions after Prelude loading */
182 #define EXIT 5 /* Take action immediately before exit() */
183 #define BREAK 6 /* Take action after program break */
184 #define GCDONE 7 /* Restore subsystem invariantss after GC */
186 /* PREPREL was formerly called INSTALL. POSTPREL doesn't have an analogy
192 extern Void setGoal Args((String, Target));
193 extern Void soFar Args((Target));
194 extern Void done Args((Void));
195 extern String fromEnv Args((String,String));
196 extern Bool chase Args((List));
198 extern Void storage Args((Int));
200 extern Void input Args((Int));
201 extern Void consoleInput Args((String));
202 extern Void projInput Args((String));
203 extern Void stringInput Args((String));
204 extern Void parseScript Args((String,Long));
205 extern Void parseExp Args((Void));
206 #if EXPLAIN_INSTANCE_RESOLUTION
207 extern Void parseContext Args((Void));
209 extern String readFilename Args((Void));
210 extern String readLine Args((Void));
211 extern Syntax defaultSyntax Args((Text));
212 extern Syntax syntaxOf Args((Name));
213 extern String unlexChar Args((Char,Char));
214 extern Void printString Args((String));
216 extern Void substitution Args((Int));
217 extern Void optimiser Args((Int));
219 extern Void staticAnalysis Args((Int));
220 extern Void startModule Args((Cell));
221 extern Void setExportList Args((List));
222 extern Void setExports Args((List));
223 extern Void addQualImport Args((Text,Text));
224 extern Void addUnqualImport Args((Text,List));
226 extern Void tyconDefn Args((Int,Cell,Cell,Cell));
227 extern Void setTypeIns Args((List));
228 extern Void clearTypeIns Args((Void));
229 extern Type fullExpand Args((Type));
230 extern Bool isAmbiguous Args((Type));
231 extern Void ambigError Args((Int,String,Cell,Type));
232 extern Void classDefn Args((Int,Cell,List,List));
233 extern Void instDefn Args((Int,Cell,Cell));
234 extern Void addTupInst Args((Class,Int));
236 extern Inst addRecShowInst Args((Class,Ext));
237 extern Inst addRecEqInst Args((Class,Ext));
239 extern List typeVarsIn Args((Cell,List,List,List));
240 extern List oclose Args((List,List));
241 extern List zonkTyvarsIn Args((Type,List));
242 extern Type zonkTyvar Args((Int));
243 extern Type zonkType Args((Type,Int));
244 extern Void primDefn Args((Cell,List,Cell));
245 extern Void defaultDefn Args((Int,List));
246 extern Void checkExp Args((Void));
247 #if EXPLAIN_INSTANCE_RESOLUTION
248 extern Void checkContext Args((Void));
250 extern Void checkDefns Args((Void));
251 extern Bool h98Pred Args((Bool,Cell));
252 extern Cell h98Context Args((Bool,List));
253 extern Void h98CheckCtxt Args((Int,String,Bool,List,Inst));
254 extern Void h98CheckType Args((Int,String,Cell,Type));
255 extern Void h98DoesntSupport Args((Int,String));
257 extern Void typeChecker Args((Int));
258 extern Type typeCheckExp Args((Bool));
259 extern Void typeCheckDefns Args((Void));
260 extern Cell provePred Args((Kinds,List,Cell));
261 extern List simpleContext Args((List,Int));
262 extern Cell rhsExpr Args((Cell));
263 extern Int rhsLine Args((Cell));
264 extern Bool isProgType Args((List,Type));
265 extern Cell superEvid Args((Cell,Class,Class));
266 extern Void linkPreludeTC Args((Void));
267 extern Void linkPreludeCM Args((Void));
269 extern Void compiler Args((Int));
270 extern Void compileDefns Args((Void));
271 extern Void compileExp Args((Void));
272 extern Bool failFree Args((Cell));
273 extern Int discrArity Args((Cell));
275 extern Addr codeGen Args((Name,Int,Cell));
276 extern Void implementCfun Args((Name,List));
278 extern Name implementRecShw Args((Text,Cell));
279 extern Name implementRecEq Args((Text,Cell));
281 extern Void addCfunTable Args((Tycon));
282 extern Name succCfun Args((Name));
283 extern Name nextCfun Args((Name,Name));
284 extern Name cfunByNum Args((Name,Int));
285 extern Void unwind Args((Cell));
286 extern Void run Args((Addr,StackPtr));
288 extern Void eval Args((Cell));
289 extern Cell evalWithNoError Args((Cell));
290 extern Void evalFails Args((StackPtr));
292 extern Void abandon Args((String,Cell));
293 extern Void outputString Args((FILE *));
294 extern Void dialogue Args((Cell));
295 #define consChar(c) ap(nameCons,mkChar(c))
297 extern Int shellEsc Args((String));
298 extern Int getTerminalWidth Args((Void));
299 extern Void normalTerminal Args((Void));
300 extern Void noechoTerminal Args((Void));
301 extern Int readTerminalChar Args((Void));
302 extern Void gcStarted Args((Void));
303 extern Void gcScanning Args((Void));
304 extern Void gcRecovered Args((Int));
305 extern Void gcCStack Args((Void));
306 extern Void needPrims Args((Int));
307 extern List calcFunDepsPreds Args((List));
308 extern Inst findInstFor Args((Cell,Int));
310 extern List findInstsFor Args((Cell,Int));
313 extern Void ppScripts ( Void );
314 extern Void ppModules ( Void );
316 extern Type primType( Int /*AsmMonad*/ monad, String a_kinds, String r_kinds );
317 #define aVar mkOffset(0) /* Simple skeleton for type var */
319 /*-------------------------------------------------------------------------*/
321 /*---------------------------------------------------------------------------
322 * Interrupting execution (signals, allowBreak):
323 *-------------------------------------------------------------------------*/
325 extern Bool breakOn Args((Bool));
327 extern Bool broken; /* indicates interrupt received */
329 #ifndef SIGBREAK /* Sigh, not defined in cygwin32 beta release 16 */
333 /* allowBreak: call to allow user to interrupt computation
334 * ctrlbrk: set control break handler
339 # define allowBreak() kbhit()
340 #else /* !HUGS_FOR_WINDOWS */
341 # if HAVE_SIGPROCMASK
343 # define ctrlbrk(bh) { sigset_t mask; \
345 sigemptyset(&mask); \
346 sigaddset(&mask, SIGINT); \
347 sigprocmask(SIG_UNBLOCK, &mask, NULL); \
350 # define ctrlbrk(bh) signal(SIGINT,bh)
353 extern int time_release;
354 extern int allow_break_count;
355 # define allowBreak() if (time_release !=0 && \
356 (++allow_break_count % time_release) == 0) \
359 # define allowBreak() if (broken) { broken=FALSE; sigRaise(breakHandler); }
361 #endif /* !HUGS_FOR_WINDOWS */
363 /*---------------------------------------------------------------------------
364 * Environment variables and the registry
365 *-------------------------------------------------------------------------*/
367 /* On Win32 we can use the registry to supplement info in environment
370 /* AJG: Commented out for now for development */
371 /* #define USE_REGISTRY (HAVE_WINDOWS_H && !__MSDOS__) */
374 Bool writeRegString Args((String var, String val));
375 String readRegString Args((String var, String def));
376 Int readRegInt Args((String var, Int def));
377 Bool writeRegInt Args((String var, Int val));
380 #define N_INSTALLDIR 200
381 extern char installDir[N_INSTALLDIR];
383 /*---------------------------------------------------------------------------
385 *-------------------------------------------------------------------------*/
388 # include <sys/types.h>
390 #elif !HUGS_FOR_WINDOWS
391 extern int chdir Args((const char*));
397 extern int system Args((const char *));
398 extern double atof Args((const char *));
399 extern void exit Args((int));
402 #ifndef FILENAME_MAX /* should already be defined in an ANSI compiler*/
403 #define FILENAME_MAX 256
405 #if FILENAME_MAX < 256
407 #define FILENAME_MAX 256
411 /* Hack, hack: if you have dos.h, you probably have a DOS filesystem */
412 #define DOS_FILENAMES HAVE_DOS_H
413 /* ToDo: can we replace this with a feature test? */
414 #define MAC_FILENAMES SYMANTEC_C
416 #define CASE_INSENSITIVE_FILENAMES (DOS_FILENAMES | RISCOS)
418 #if CASE_INSENSITIVE_FILENAMES
420 # define filenamecmp(s1,s2) strcasecmp(s1,s2)
422 # define filenamecmp(s1,s2) _stricmp(s1,s2)
424 # define filenamecmp(s1,s2) stricmp(s1,s2)
426 # define filenamecmp(s1,s2) strcmpi(s1,s2)
429 # define filenamecmp(s1,s2) strcmp(s1,s2)
432 /*---------------------------------------------------------------------------
433 * Pipe-related operations:
435 * On Windows, many standard Unix names acquire a leading underscore.
436 * Irritating, but easy to work around.
437 *-------------------------------------------------------------------------*/
439 #if !defined(HAVE_POPEN) && defined(HAVE__POPEN)
440 #define popen(x,y) _popen(x,y)
442 #if !defined(HAVE_PCLOSE) && defined(HAVE__PCLOSE)
443 #define pclose(x) _pclose(x)
446 /*---------------------------------------------------------------------------
448 *-------------------------------------------------------------------------*/
450 #define bitArraySize(n) ((n)/bitsPerWord + 1)
451 #define placeInSet(n) ((-(n)-1)>>wordShift)
452 #define maskInSet(n) (1<<((-(n)-1)&wordMask))
454 /*---------------------------------------------------------------------------
455 * Function prototypes for code in machdep.c
456 *-------------------------------------------------------------------------*/
458 extern String findMPathname Args((String,String,String));
459 extern String findPathname Args((String,String));
461 extern Int shellEsc Args((String));
462 extern Int getTerminalWidth Args((Void));
463 extern Void normalTerminal Args((Void));
464 extern Void noechoTerminal Args((Void));
465 extern Int readTerminalChar Args((Void));
466 extern Void gcStarted Args((Void));
467 extern Void gcScanning Args((Void));
468 extern Void gcRecovered Args((Int));
469 extern Void gcCStack Args((Void));
471 /*-------------------------------------------------------------------------*/
473 extern Type typeInt64;
474 extern Type typeWord;
475 extern Type typeFloat;
476 extern Type typePrimArray;
477 extern Type typePrimByteArray;
479 extern Type typePrimMutableArray;
480 extern Type typePrimMutableByteArray;
481 extern Type typeStable;
482 extern Type typeWeak;
484 extern Type typeForeign;
485 extern Type typeMVar;
486 extern Type typeThreadId;
487 extern Type typeException;
491 extern Void foreignImport Args((Cell,Text,Pair,Cell,Cell));
492 extern List foreignImports; /* foreign import declarations */
493 extern Void implementForeignImport Args((Name));
494 extern Void foreignExport Args((Cell,Text,Cell,Cell,Cell));
495 extern List foreignExports; /* foreign export declarations */
496 extern Void implementForeignExport Args((Name));
501 Int userArity Args((Name));
504 extern List deriveEq Args((Tycon));
505 extern List deriveOrd Args((Tycon));
506 extern List deriveEnum Args((Tycon));
507 extern List deriveIx Args((Tycon));
508 extern List deriveShow Args((Tycon));
509 extern List deriveRead Args((Cell));
510 extern List deriveBounded Args((Tycon));
511 extern List checkPrimDefn Args((Triple));
513 extern Bool typeMatches Args((Type,Type));
514 extern Void evalExp Args((Void));
515 extern Void linkControl Args((Int));
516 extern Void deriveControl Args((Int));
517 extern Void translateControl Args((Int));
518 extern Void codegen Args((Int));
519 extern Void machdep Args((Int));
521 extern Void linkPrimitiveNames(void);
523 extern Kind starToStar; /* Type -> Type */
524 extern Type boundPair; /* (mkOffset(0),mkOffset(0)) */
525 extern Type typeOrdering;
527 extern Type conToTagType Args((Tycon));
528 extern Type tagToConType Args((Tycon));
530 #define BOGUS(k) (-9000000-(k))
532 extern Void putChr Args((Int));
533 extern Void putStr Args((String));
534 extern Void putInt Args((Int));
535 extern Void putPtr Args((Ptr));
537 extern Void unlexCharConst Args((Cell));
538 extern FILE *outputStream; /* current output stream */
539 extern Int outColumn; /* current output column number */
541 extern Void unlexStrConst Args((Text));
542 extern Void unlexVar Args((Text));
543 extern Void unlexVarStr Args((String));
544 extern List offsetTyvarsIn Args((Type,List));
546 extern List cfunSfuns; /* List of (Cfun,[SelectorVar]) */
548 extern Void interface Args((Int));
550 extern Void getFileSize Args((String, Long *));
552 extern ZPair readInterface Args((String,Long));
553 extern Bool processInterfaces Args((Void));
554 extern void ifLinkConstrItbl ( Name n );
557 extern List /* of ZTriple(I_INTERFACE,
558 Text--name of obj file,
559 Int--size of obj file) */
563 extern Void hi_o_namesFromSrcName Args((String,String*,String* oName));
564 extern Cell parseInterface Args((String,Long));
566 extern String getExtraObjectInfo ( String primaryObjectName,
567 String extraFileName,
568 Int* extraFileSize );
570 extern Name newDSel Args((Class,Int));
571 extern Int visitClass Args((Class));
573 extern Kind simpleKind Args((Int));