186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//                     The LLVM Compiler Infrastructure
386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source
586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details.
686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  testfilerunner.h
986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  testObjects
1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  Created by Blaine Garst on 9/24/08.
1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <Cocoa/Cocoa.h>
1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst/*
1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    variations:
1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        four source types:  C, ObjC, C++, ObjC++,
1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst          and for ObjC or ObjC++ we have
2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst             RR and GC capabilities
2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        we assume C++ friendly includes for C/ObjC even if C++ isn't used
2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        four compilers: C, ObjC, C++, ObjC++
2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst          and for ObjC or ObjC++ we can compile
2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst              RR, RR+GC, GC+RR, GC
2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst          although to test RR+GC we need to build a shell "main" in both modes
2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst          and/or run with GC disabled if possible.
2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    To maximize coverage we mark files with capabilities and then ask them to be
3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    compiled with each variation of compiler and option.
3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    If the file doesn't have the capability it politely refuses.
3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst*/
3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstenum options {
3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    Do64   = (1 << 0),
3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoCPP  = (1 << 1),
3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoOBJC = (1 << 3),
3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoGC   = (1 << 4),
4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoRR   = (1 << 5),
4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoRRGC = (1 << 6),  // -fobjc-gc but main w/o so it runs in RR mode
4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoGCRR = (1 << 7),  // -fobjc-gc & run GC mode
4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    //DoDashG = (1 << 8),
4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoDashO = (1 << 9),
4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoDashOs = (1 << 10),
4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoDashO2 = (1 << 11),
4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    DoC99 = (1 << 12), // -std=c99
5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst};
5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@class TestFileExeGenerator;
5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// this class will actually compile and/or run a target binary
5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// XXX we don't track which dynamic libraries requested/used nor set them up
5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@interface TestFileExe : NSObject {
5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    NSPointerArray *compileLine;
5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    int options;
6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool shouldFail;
6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    TestFileExeGenerator *generator;
6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *binaryName;
6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *sourceName;
6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *libraryPath;
6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *frameworkPath;
6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
6786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property int options;
6886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property(assign) NSPointerArray *compileLine;
6986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property(assign) TestFileExeGenerator *generator;
7086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property bool shouldFail;
7186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *binaryName;
7286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *sourceName;
7386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *libraryPath;
7486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *frameworkPath;
7586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst- (bool) compileUnlessExists:(bool)skip;
7686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst- (bool) run;
7786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property(readonly) __strong char *radar;
7886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@end
7986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// this class generates an appropriate set of configurations to compile
8186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// we don't track which gcc we use but we should XXX
8286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@interface TestFileExeGenerator : NSObject {
8386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool hasObjC;
8486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool hasRR;
8586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool hasGC;
8686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool hasCPlusPlus;
8786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool wantsC99;
8886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool wants64;
8986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool wants32;
9086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool supposedToNotCompile;
9186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    bool open;              // this problem is still open - e.g. unresolved
9286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *radar; // for things already known to go wrong
9386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *filename;
9486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *compilerPath;
9586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *errorString;
9686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __strong char *warningString;
9786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    NSPointerArray *extraLibraries;
9886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
9986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property bool hasObjC, hasRR, hasGC, hasCPlusPlus, wantsC99, supposedToNotCompile, open, wants32, wants64;
10086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property(assign) __strong char *radar;
10186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *filename;
10286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *compilerPath;
10386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *errorString;
10486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@property __strong char *warningString;
10586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst- (TestFileExe *)lineForOptions:(int)options; // nil if no can do
10686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst+ (NSArray *)generatorsFromFILE:(FILE *)fd;
10786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst+ (NSArray *)generatorsFromPath:(NSString *)path;
10886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst@end
10986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
11086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
111