diff --git a/examples_ptx/ptxcc/Makefile b/examples_ptx/ptxcc/Makefile index 7db36eec..48f875e4 100644 --- a/examples_ptx/ptxcc/Makefile +++ b/examples_ptx/ptxcc/Makefile @@ -1,4 +1,4 @@ -all: dePTX +all: dePTX ptxc ptxgrammar.cc : ptxgrammar.yy bison -d -v -t ptxgrammar.yy -o ptxgrammar.cc @@ -7,20 +7,24 @@ ptx.cc: ptx.ll ptxgrammar.cc flex -t ptx.ll > ptx.cc %.o: %.cc - clang++ -O3 -c $< -o $@ -I/opt/local/include + clang++ -O3 -c $< -o $@ -I/opt/local/include %.o: %.cpp - clang++ -O3 -c $< -o $@ -I/opt/local/include + clang++ -O3 -c $< -o $@ -I/opt/local/include -OBJ= dePTX.o \ - ptx.o \ +OBJ= ptx.o \ ptxgrammar.o -dePTX: $(OBJ) +dePTX: dePTX.o $(OBJ) + clang++ $^ -o $@ -L/opt/local/lib + +ptxc: ptxc.o $(OBJ) clang++ $^ -o $@ -L/opt/local/lib clean: /bin/rm -f dePTX $(OBJ) ptxgrammar.hh ptxgrammar.cc ptx.cc ptxgrammar.output $(OBJ): ptxgrammar.cc ptx.cc PTXParser.h PTXLexer.h +dePTX.o: PTXParser.h PTXLexer.h +ptxc.o: PTXParser.h PTXLexer.h diff --git a/examples_ptx/ptxcc/PTXParser.h b/examples_ptx/ptxcc/PTXParser.h index b7fc35e1..d221d739 100644 --- a/examples_ptx/ptxcc/PTXParser.h +++ b/examples_ptx/ptxcc/PTXParser.h @@ -71,7 +71,7 @@ namespace parser s << "typedef float f32_t; \n"; s << "typedef double f64_t; \n"; s << " \n"; - std::cout << s.str(); + out << s.str(); } #define LOC YYLTYPE& location @@ -166,7 +166,7 @@ namespace parser s << "\n"; argumentList.clear(); - std::cout << s.str(); + out << s.str(); } void visibleFunctionDeclaration(const std::string &calleeName, LOC) @@ -193,7 +193,7 @@ namespace parser argumentList.clear(); returnArgumentList.clear(); - std::cout << s.str(); + out << s.str(); } void visibleInitializableDeclaration(const std::string &name, LOC) @@ -208,7 +208,7 @@ namespace parser s << name << ";\n\n"; else s << name << "[" << arrayDimensionsList[0] << "] = {0};\n\n"; - std::cout << s.str(); + out << s.str(); arrayDimensionsList.clear(); } diff --git a/examples_ptx/ptxcc/ptxc.cpp b/examples_ptx/ptxcc/ptxc.cpp index f50a3785..9d8b462a 100644 --- a/examples_ptx/ptxcc/ptxc.cpp +++ b/examples_ptx/ptxcc/ptxc.cpp @@ -6,7 +6,7 @@ #include #include "PTXParser.h" -static char lRandomChar() +static char lRandomAlNum() { const char charset[] = "0123456789" @@ -19,11 +19,10 @@ static char lRandomChar() static std::string lRandomString(const size_t length) { std::string str(length,0); - std::generate_n( str.begin(), length, lRandomChar); + std::generate_n( str.begin(), length, lRandomAlNum); return str; } - static void lGetAllArgs(int Argc, char *Argv[], int &argc, char *argv[128]) { // Copy over the command line arguments (passed in) @@ -49,8 +48,14 @@ static std::vector lSplitString(const std::string &s, char delim) return elems; } -static void usage(const int ret) +static void lUsage(const int ret) { + fprintf(stderr, "\nusage: ptxc\n"); + fprintf(stderr, " [--help]\t\t\t\t This help\n"); + fprintf(stderr, " [--arch={%s}]\t\t\t GPU target architecture\n", "sm_35"); + fprintf(stderr, " [-o ]\t\t\t\t Output file name\n"); + fprintf(stderr, " [-Xnvcc=]\t\t Arguments to pass through to \"nvcc\"\n"); + fprintf(stderr, " \n"); exit(ret); } @@ -65,38 +70,39 @@ int main(int _argc, char * _argv[]) std::string fileOBJ; std::string extString = ".ptx"; bool keepTemporaries = false; + std::string nvccArguments; - std::vector nvccArgumentList; - for (int i = 1; i < argc; ++i) { if (!strcmp(argv[i], "--help")) - usage(0); + lUsage(0); else if (!strncmp(argv[i], "--arch=", 7)) arch = std::string(argv[i]+7); else if (!strncmp(argv[i], "--keep-temporaries", 11)) keepTemporaries = true; + else if (!strncmp(argv[i], "-Xnvcc=", 7)) + nvccArguments = std::string(argv[i]+7); else if (!strcmp(argv[i], "-o")) { if (++i == argc) { fprintf(stderr, "No output file specified after -o option.\n"); - usage(1); + lUsage(1); } fileOBJ = std::string(argv[i]); } - else if (strncmp(argv[i], "-", 1)) + else { const char * ext = strrchr(argv[i], '.'); if (ext == NULL) { fprintf(stderr, " Unknown argument: %s \n", argv[i]); - exit(1); + lUsage(1); } else if (strncmp(ext, extString.c_str(), 4)) { fprintf(stderr, " Unkown extension of the input file: %s \n", ext); - exit(1); + lUsage(1); } else if (filePTX.empty()) { @@ -110,8 +116,6 @@ int main(int _argc, char * _argv[]) fileOBJ += ".o"; } } - else - nvccArgumentList.push_back(argv[i]); } #if 0 fprintf(stderr, " fileOBJ= %s\n", fileOBJ.c_str()); @@ -172,8 +176,7 @@ int main(int _argc, char * _argv[]) nvccCmd += "-dc "; nvccCmd += std::string("-arch=") + arch + std::string(" "); nvccCmd += "-dryrun "; - for (int i = 0; i < (int)nvccArgumentList.size(); i++) - nvccCmd += nvccArgumentList[i] + std::string(" "); + nvccCmd += nvccArguments + std::string(" "); nvccCmd += std::string("-o ") + fileOBJ + std::string(" "); nvccCmd += fileCU + std::string(" "); nvccCmd += std::string("2> ") + fileSH; diff --git a/examples_ptx/ptxcc/ptxgrammar.yy b/examples_ptx/ptxcc/ptxgrammar.yy index 843d88c0..482340af 100644 --- a/examples_ptx/ptxcc/ptxgrammar.yy +++ b/examples_ptx/ptxcc/ptxgrammar.yy @@ -74,16 +74,16 @@ ptxsource: header: version target address_size { - std::cerr << "Done reading PTX \n" << std::endl; +// std::cerr << "Done reading PTX \n" << std::endl; state.printHeader(); }; version: - TOKEN_VERSION TOKEN_FLOAT { std::cerr << "Reading PTX version " << $2 << std::endl; }; + TOKEN_VERSION TOKEN_FLOAT { assert($2 >= 3.0); } ;//std::cerr << "Reading PTX version " << $2 << std::endl; }; target: - TOKEN_TARGET TOKEN_STRING { std::cerr << "Target " << $2 << std::endl; }; + TOKEN_TARGET TOKEN_STRING { assert(std::string($2) == std::string("sm_35")); } //std::cerr << "Target " << $2 << std::endl; }; address_size: - TOKEN_ADDRESS_SIZE TOKEN_INT { std::cerr << "Address_Size " << $2 << std::endl; }; + TOKEN_ADDRESS_SIZE TOKEN_INT { assert($2 == 64); } //std::cerr << "Address_Size " << $2 << std::endl; }; dataTypeId : @@ -208,8 +208,8 @@ void yyerror( YYLTYPE* location, parser::PTXLexer& lexer, std::stringstream stream; stream << toString( *location, state ) << " " << message; - fprintf(stderr, "--ERROR-- %s %s \n", toString(*location, state).c_str(), message); - assert(0); + fprintf(stderr, "--Parser ERROR-- %s %s \n", toString(*location, state).c_str(), message); + exit(-1); } }