/// entry to our framework int main(int argc, char *argv[]) { // first, print the Copyright notice printCopyright(); // argument list for Driver after removing our compiler flags SmallVector<const char *, 16> args; CompilerOptions compilerOptions = CompilerOptions(); std::string out; // parse command line options for (int i=0; i<argc; ++i) { if (StringRef(argv[i]) == "-emit-cpu") { compilerOptions.setTargetLang(Language::C99); continue; } if (StringRef(argv[i]) == "-emit-cuda") { compilerOptions.setTargetLang(Language::CUDA); continue; } if (StringRef(argv[i]) == "-emit-opencl-acc") { compilerOptions.setTargetLang(Language::OpenCLACC); continue; } if (StringRef(argv[i]) == "-emit-opencl-cpu") { compilerOptions.setTargetLang(Language::OpenCLCPU); continue; } if (StringRef(argv[i]) == "-emit-opencl-gpu") { compilerOptions.setTargetLang(Language::OpenCLGPU); continue; } if (StringRef(argv[i]) == "-emit-renderscript") { compilerOptions.setTargetLang(Language::Renderscript); continue; } if (StringRef(argv[i]) == "-emit-filterscript") { compilerOptions.setTargetLang(Language::Filterscript); compilerOptions.setPixelsPerThread(1); continue; } if (StringRef(argv[i]) == "-emit-padding") { assert(i<(argc-1) && "Mandatory alignment parameter for -emit-padding switch missing."); std::istringstream buffer(argv[i+1]); int val; buffer >> val; if (buffer.fail()) { llvm::errs() << "ERROR: Expected alignment in bytes for -emit-padding switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setPadding(val); ++i; continue; } if (StringRef(argv[i]) == "-target") { assert(i<(argc-1) && "Mandatory code name parameter for -target switch missing."); if (StringRef(argv[i+1]) == "Fermi-20") { compilerOptions.setTargetDevice(Device::Fermi_20); } else if (StringRef(argv[i+1]) == "Fermi-21") { compilerOptions.setTargetDevice(Device::Fermi_21); } else if (StringRef(argv[i+1]) == "Kepler-30") { compilerOptions.setTargetDevice(Device::Kepler_30); } else if (StringRef(argv[i+1]) == "Kepler-32") { compilerOptions.setTargetDevice(Device::Kepler_32); } else if (StringRef(argv[i+1]) == "Kepler-35") { compilerOptions.setTargetDevice(Device::Kepler_35); } else if (StringRef(argv[i+1]) == "Kepler-37") { compilerOptions.setTargetDevice(Device::Kepler_37); } else if (StringRef(argv[i+1]) == "Maxwell-50") { compilerOptions.setTargetDevice(Device::Maxwell_50); } else if (StringRef(argv[i+1]) == "Maxwell-52") { compilerOptions.setTargetDevice(Device::Maxwell_52); } else if (StringRef(argv[i+1]) == "Maxwell-53") { compilerOptions.setTargetDevice(Device::Maxwell_53); } else if (StringRef(argv[i+1]) == "Evergreen") { compilerOptions.setTargetDevice(Device::Evergreen); } else if (StringRef(argv[i+1]) == "NorthernIsland") { compilerOptions.setTargetDevice(Device::NorthernIsland); } else if (StringRef(argv[i+1]) == "Midgard") { compilerOptions.setTargetDevice(Device::Midgard); } else if (StringRef(argv[i+1]) == "KnightsCorner") { compilerOptions.setTargetDevice(Device::KnightsCorner); } else { llvm::errs() << "ERROR: Expected valid code name specification for -target switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-explore-config") { compilerOptions.setExploreConfig(USER_ON); continue; } if (StringRef(argv[i]) == "-use-config") { assert(i<(argc-1) && "Mandatory configuration specification for -use-config switch missing."); int x=0, y=0, ret=0; ret = sscanf(argv[i+1], "%dx%d", &x, &y); if (ret!=2) { llvm::errs() << "ERROR: Expected valid configuration specification for -use-config switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setKernelConfig(x, y); ++i; continue; } if (StringRef(argv[i]) == "-time-kernels") { compilerOptions.setTimeKernels(USER_ON); continue; } if (StringRef(argv[i]) == "-use-textures") { assert(i<(argc-1) && "Mandatory texture memory specification for -use-textures switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setTextureMemory(Texture::None); } else if (StringRef(argv[i+1]) == "Linear1D") { compilerOptions.setTextureMemory(Texture::Linear1D); } else if (StringRef(argv[i+1]) == "Linear2D") { compilerOptions.setTextureMemory(Texture::Linear2D); } else if (StringRef(argv[i+1]) == "Array2D") { compilerOptions.setTextureMemory(Texture::Array2D); } else if (StringRef(argv[i+1]) == "Ldg") { compilerOptions.setTextureMemory(Texture::Ldg); } else { llvm::errs() << "ERROR: Expected valid texture memory specification for -use-textures switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-use-local") { assert(i<(argc-1) && "Mandatory local memory specification for -use-local switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setLocalMemory(USER_OFF); } else if (StringRef(argv[i+1]) == "on") { compilerOptions.setLocalMemory(USER_ON); } else { llvm::errs() << "ERROR: Expected valid local memory specification for -use-local switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-vectorize") { assert(i<(argc-1) && "Mandatory vectorization specification for -vectorize switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setVectorizeKernels(USER_OFF); } else if (StringRef(argv[i+1]) == "on") { compilerOptions.setVectorizeKernels(USER_ON); } else { llvm::errs() << "ERROR: Expected valid vectorization specification for -use-vectorize switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-pixels-per-thread") { assert(i<(argc-1) && "Mandatory integer parameter for -pixels-per-thread switch missing."); std::istringstream buffer(argv[i+1]); int val; buffer >> val; if (buffer.fail()) { llvm::errs() << "ERROR: Expected integer parameter for -pixels-per-thread switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setPixelsPerThread(val); ++i; continue; }
/// entry to our framework int main(int argc, char *argv[]) { // first, print the Copyright notice printCopyright(); // get stack trace on SegFaults llvm::sys::PrintStackTraceOnErrorSignal(); llvm::PrettyStackTraceProgram X(argc, argv); // argument list for CompilerInvocation after removing our compiler flags SmallVector<const char *, 16> Args; CompilerOptions compilerOptions = CompilerOptions(); // support exceptions Args.push_back("-fexceptions"); // parse command line options for (int i=1; i<argc; ++i) { if (StringRef(argv[i]) == "-emit-cpu") { compilerOptions.setTargetCode(TARGET_C); continue; } if (StringRef(argv[i]) == "-emit-cuda") { compilerOptions.setTargetCode(TARGET_CUDA); continue; } if (StringRef(argv[i]) == "-emit-opencl-acc") { compilerOptions.setTargetCode(TARGET_OpenCLACC); continue; } if (StringRef(argv[i]) == "-emit-opencl-cpu") { compilerOptions.setTargetCode(TARGET_OpenCLCPU); continue; } if (StringRef(argv[i]) == "-emit-opencl-gpu") { compilerOptions.setTargetCode(TARGET_OpenCLGPU); continue; } if (StringRef(argv[i]) == "-emit-renderscript") { compilerOptions.setTargetCode(TARGET_Renderscript); continue; } if (StringRef(argv[i]) == "-emit-filterscript") { compilerOptions.setTargetCode(TARGET_Filterscript); compilerOptions.setPixelsPerThread(1); continue; } if (StringRef(argv[i]) == "-emit-padding") { assert(i<(argc-1) && "Mandatory alignment parameter for -emit-padding switch missing."); std::istringstream buffer(argv[i+1]); int val; buffer >> val; if (buffer.fail()) { llvm::errs() << "ERROR: Expected alignment in bytes for -emit-padding switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setPadding(val); ++i; continue; } if (StringRef(argv[i]) == "-target") { assert(i<(argc-1) && "Mandatory code name parameter for -target switch missing."); if (StringRef(argv[i+1]) == "Tesla-10") { compilerOptions.setTargetDevice(TESLA_10); } else if (StringRef(argv[i+1]) == "Tesla-11") { compilerOptions.setTargetDevice(TESLA_11); } else if (StringRef(argv[i+1]) == "Tesla-12") { compilerOptions.setTargetDevice(TESLA_12); } else if (StringRef(argv[i+1]) == "Tesla-13") { compilerOptions.setTargetDevice(TESLA_13); } else if (StringRef(argv[i+1]) == "Fermi-20") { compilerOptions.setTargetDevice(FERMI_20); } else if (StringRef(argv[i+1]) == "Fermi-21") { compilerOptions.setTargetDevice(FERMI_21); } else if (StringRef(argv[i+1]) == "Kepler-30") { compilerOptions.setTargetDevice(KEPLER_30); } else if (StringRef(argv[i+1]) == "Kepler-35") { compilerOptions.setTargetDevice(KEPLER_35); } else if (StringRef(argv[i+1]) == "Evergreen") { compilerOptions.setTargetDevice(EVERGREEN); } else if (StringRef(argv[i+1]) == "NorthernIsland") { compilerOptions.setTargetDevice(NORTHERN_ISLAND); } else if (StringRef(argv[i+1]) == "Midgard") { compilerOptions.setTargetDevice(MIDGARD); } else if (StringRef(argv[i+1]) == "KnightsCorner") { compilerOptions.setTargetDevice(KNIGHTSCORNER); } else { llvm::errs() << "ERROR: Expected valid code name specification for -target switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-explore-config") { compilerOptions.setExploreConfig(USER_ON); continue; } if (StringRef(argv[i]) == "-use-config") { assert(i<(argc-1) && "Mandatory configuration specification for -use-config switch missing."); int x=0, y=0, ret=0; ret = sscanf(argv[i+1], "%dx%d", &x, &y); if (ret!=2) { llvm::errs() << "ERROR: Expected valid configuration specification for -use-config switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setKernelConfig(x, y); ++i; continue; } if (StringRef(argv[i]) == "-time-kernels") { compilerOptions.setTimeKernels(USER_ON); continue; } if (StringRef(argv[i]) == "-use-textures") { assert(i<(argc-1) && "Mandatory texture memory specification for -use-textures switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setTextureMemory(NoTexture); } else if (StringRef(argv[i+1]) == "Linear1D") { compilerOptions.setTextureMemory(Linear1D); } else if (StringRef(argv[i+1]) == "Linear2D") { compilerOptions.setTextureMemory(Linear2D); } else if (StringRef(argv[i+1]) == "Array2D") { compilerOptions.setTextureMemory(Array2D); } else if (StringRef(argv[i+1]) == "Ldg") { compilerOptions.setTextureMemory(Ldg); } else { llvm::errs() << "ERROR: Expected valid texture memory specification for -use-textures switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-use-local") { assert(i<(argc-1) && "Mandatory local memory specification for -use-local switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setLocalMemory(USER_OFF); } else if (StringRef(argv[i+1]) == "on") { compilerOptions.setLocalMemory(USER_ON); } else { llvm::errs() << "ERROR: Expected valid local memory specification for -use-local switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-vectorize") { assert(i<(argc-1) && "Mandatory vectorization specification for -vectorize switch missing."); if (StringRef(argv[i+1]) == "off") { compilerOptions.setVectorizeKernels(USER_OFF); } else if (StringRef(argv[i+1]) == "on") { compilerOptions.setVectorizeKernels(USER_ON); } else { llvm::errs() << "ERROR: Expected valid vectorization specification for -use-vectorize switch.\n\n"; printUsage(); return EXIT_FAILURE; } ++i; continue; } if (StringRef(argv[i]) == "-pixels-per-thread") { assert(i<(argc-1) && "Mandatory integer parameter for -pixels-per-thread switch missing."); std::istringstream buffer(argv[i+1]); int val; buffer >> val; if (buffer.fail()) { llvm::errs() << "ERROR: Expected integer parameter for -pixels-per-thread switch.\n\n"; printUsage(); return EXIT_FAILURE; } compilerOptions.setPixelsPerThread(val); ++i; continue; }