// Copyright (c) 2009-2012, Jimmy Kwa, Andrew Boktor // The University of British Columbia // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // Redistributions in binary form must reproduce the above copyright notice, this // list of conditions and the following disclaimer in the documentation and/or // other materials provided with the distribution. // Neither the name of The University of British Columbia nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include #include #include "cuobjdumpInstList.h" using namespace std; cuobjdumpInstList *g_instList = new cuobjdumpInstList(); cuobjdumpInstList *g_headerList = new cuobjdumpInstList(); int sass_parse(); extern "C" FILE *sass_in; int ptx_parse(); extern "C" FILE *ptx_in; int elf_parse(); extern "C" FILE *elf_in; extern int g_error_detected; FILE *bin_in; FILE *ptxplus_out; void output(const char * text) { //printf(text); fprintf(ptxplus_out, text); } void output(const std::string text) { output(text.c_str()); } std::string fileToString(const char * fileName) { ifstream fileStream(fileName, ios::in); string text, line; while(getline(fileStream,line)) { text += (line + "\n"); } fileStream.close(); return text; } std::string extractFilename( const std::string& path ) { return path.substr( path.find_last_of( '/' ) +1 ); } int main(int argc, char* argv[]) { if(argc != 5) { cout << "Usage: " << argv[0] << " ptxfile sassfile elffile ptxplusfile(output)\n"; return 0; } string ptxfile = argv[1]; string sassfile = argv[2]; string elffile = argv[3]; string ptxplusfile = argv[4]; sass_in = fopen(sassfile.c_str(), "r" ); ptx_in = fopen(ptxfile.c_str(), "r" ); elf_in = fopen(elffile.c_str(), "r"); ptxplus_out = fopen(ptxplusfile.c_str(), "w" ); std::string elf = fileToString(elffile.c_str()); printf("RUNNING cuobjdump_to_ptxplus ...\n"); printf("Parsing .elf file %s\n", elffile.c_str()); elf_parse(); printf("Finished parsing .elf file %s\n", elffile.c_str()); //Parse original ptx printf("Parsing .ptx file %s\n", ptxfile.c_str()); ptx_parse(); if (g_error_detected){ assert(0 && "ptx parsing failed"); } printf("Finished parsing .ptx file %s\n", ptxfile.c_str()); // Copy real tex list from ptx to ptxplus instruction list g_instList->setRealTexList(g_headerList->getRealTexList()); // Insert global memory from bin file // g_instList->readGlobalMemoryFromBinFile(fileToString(binFilename)); // Parse cuobjdump output printf("Parsing .sass file %s\n", sassfile.c_str()); sass_parse(); printf("Finished parsing .sass file %s\n", sassfile.c_str()); // Print ptxplus output("//HEADER\n"); g_headerList->printHeaderInstList(); output("//END HEADER\n\n\n"); output("//INSTRUCTIONS\n"); g_instList->printCuobjdumpPtxPlusList(g_headerList); output("//END INSTRUCTIONS\n"); fclose(sass_in); fclose(ptx_in); fclose(ptxplus_out); printf("DONE. \n"); return 0; }