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