summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/ifcompiler/initCompiler.C
diff options
context:
space:
mode:
authorMike Jones <mjjones@us.ibm.com>2011-11-17 19:38:31 -0600
committerMIKE J. JONES <mjjones@us.ibm.com>2011-11-21 12:07:50 -0600
commit11c80c5abcf203e5a65098ea047fd6d2a6e607cc (patch)
tree1e1a5246e8ed0b25b66e6e1e34bba7622f63bbea /src/usr/hwpf/ifcompiler/initCompiler.C
parentb9d93e82a069b6650f3bd7b43abe6aecc0bf2e4e (diff)
downloadblackbird-hostboot-11c80c5abcf203e5a65098ea047fd6d2a6e607cc.tar.gz
blackbird-hostboot-11c80c5abcf203e5a65098ea047fd6d2a6e607cc.zip
HWPF: Only support initfile attributes in fapiGetInitFileAttr()
Change-Id: Ia1ffa854d55b68f0e32595080bba323cd52e23a3 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/503 Tested-by: Jenkins Server Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com> Reviewed-by: CAMVAN T. NGUYEN <ctnguyen@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/ifcompiler/initCompiler.C')
-rwxr-xr-xsrc/usr/hwpf/ifcompiler/initCompiler.C311
1 files changed, 311 insertions, 0 deletions
diff --git a/src/usr/hwpf/ifcompiler/initCompiler.C b/src/usr/hwpf/ifcompiler/initCompiler.C
new file mode 100755
index 000000000..de8553e6c
--- /dev/null
+++ b/src/usr/hwpf/ifcompiler/initCompiler.C
@@ -0,0 +1,311 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/ifcompiler/initCompiler.C,v $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2010,2010
+//
+//UNDEFINED
+//
+// Origin: UNDEFINED
+//
+// IBM_PROLOG_END_TAG
+// Change Log *************************************************************************************
+//
+// Flag Track Userid Date Description
+// ----- -------- -------- -------- -------------------------------------------------------------
+// D754106 dgilbert 06/14/10 Create
+// dg002 SW039868 dgilbert 10/15/10 Add support to filter unneeded inits by EC
+// dg003 D779902 dgilbert 12/08/10 Add ability to specify ouput if file
+// andrewg 05/24/11 Port over for VPL/PgP
+// andrewg 09/19/11 Updates based on review
+// mjjones 11/17/11 Output attribute listing
+// End Change Log *********************************************************************************
+
+/**
+ * @file initCompiler.C
+ * @brief Compile an initfile into bytecode.
+ */
+#include <stdint.h>
+#include <stdio.h>
+#include <string>
+#include <sstream>
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+#include <map>
+#include <stdexcept>
+#include <initCompiler.H>
+#include <initRpn.H>
+#include <initSymbols.H>
+#include <initScom.H>
+//#include <initSpy.H>
+
+using namespace init;
+using namespace std;
+
+//Globals
+
+int yyline = 1;
+init::ScomList * yyscomlist = NULL;
+
+ostringstream init::dbg;
+ostringstream init::erros;
+ostringstream init::stats; // TODO move to Parser
+
+// Main
+int main(int narg, char ** argv)
+{
+ int rc = 0;
+
+#if 0
+ yyin = fopen("sample.initfile","r");
+ if(!yyin)
+ {
+ std::cerr << "\nERROR: Failed to open sample.initfile! " << std::endl;
+ exit(-1);
+ }
+ yyparse();
+ fclose(yyin);
+#endif
+
+ try
+ {
+ // Parser:
+ // - Parse args
+ // - Set up source location and source type
+ // - Load & parse Symbols & Spy/Array tables
+ // - Load & parse the initfile (if there is one)
+ //
+ Parser parsed(narg,argv);
+
+ string initfile = parsed.source_fn();
+ uint32_t type = parsed.get_source_type();
+
+ BINSEQ bin_seq;
+ bin_seq.reserve(0x38000);
+
+ if(type == Parser::IF_TYPE) // input is binary *.if file - build listing from it.
+ {
+
+ //for(SPY_LIST::iterator i = yyspylist->begin(); i != yyspylist->end(); ++i)
+ //{
+ // cout << (*i)->listing() << endl;
+ //}
+
+ ifstream ifs(initfile.c_str(), ios_base::in | ios_base::binary);
+ if(!ifs)
+ {
+ string msg("Can't open ");
+ msg.append(initfile);
+ throw invalid_argument(msg);
+ }
+ while(1)
+ {
+ int ch = ifs.get();
+ if (!(ifs.good())) break;
+ bin_seq.push_back(ch);
+ }
+ ifs.close();
+
+ yyscomlist->listing(bin_seq, cout);
+
+ erros << parsed.get_scomlist()->get_symbols()->not_found_listing();
+
+ }
+ else // normal initfile processing
+ {
+ // Already parsed
+ yyscomlist->compile(bin_seq);
+
+
+ std::cerr << "Compiled size = " << std::dec << bin_seq.size() << endl;
+
+ // if there are missing symbols, SpyList::listing() will add duplicates
+ // So get the listing now
+ erros << parsed.get_scomlist()->get_symbols()->not_found_listing();
+
+ string if_fn = parsed.binseq_fn();
+ ofstream ofs(if_fn.c_str(), ios_base::out | ios_base::binary);
+ if(!ofs)
+ {
+ erros << "ERROR - Could not open" << if_fn << endl;
+ throw invalid_argument(if_fn);
+ }
+ else
+ {
+ for(BINSEQ::const_iterator bli = bin_seq.begin(); bli != bin_seq.end(); ++bli)
+ ofs.put((char)(*bli));
+
+ ofs.close();
+ }
+ //cout << dbg << std::endl;
+ printf("Generate Listing\n");
+ // This builds a listing from the compiled binary sequence
+ yyscomlist->listing(bin_seq, parsed.listing_ostream());
+ yyscomlist->attr_listing(bin_seq, parsed.attr_listing_ostream());
+
+ // open if file and read in to new SpyList
+
+ printf("Generate Stats\n");
+ stats << "*********************************************************\n";
+
+ cerr << stats.str() << endl; // TODO -> cout
+
+ }
+
+ printf("Generate Debug\n");
+ parsed.capture_dbg();
+ //if(parsed.debug_mode()) cout << dbg.str() << endl;
+ }
+ catch(exception & e)
+ {
+ cerr << "ERROR! exception caught: " << e.what() << endl;
+ rc = 2;
+ }
+
+ if(erros.str().size())
+ {
+ rc = 1;
+ cerr << erros.str() << endl;
+ }
+ return rc;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Parser:
+// Check the args and build the symbol table
+// -----------------------------------------------------------------------------------------------
+
+Parser::Parser(int narg, char ** argv)
+: iv_type(0), iv_scomlist(NULL), iv_dbg(false), iv_ec(0xFFFFFFFF) //dg002c
+{
+ set<string> header_files;
+ iv_prog_name = argv[0];
+
+ stats << iv_prog_name << endl;
+ --narg; ++argv;
+
+ string type;
+
+ pair<string,string> compare;
+
+ for(int i = 0; i < narg; ++i)
+ {
+ string arg(argv[i]);
+ if(arg.compare(0,5,"-init") == 0) iv_source_path = argv[++i];
+ else if (arg.compare(0,3,"-kw") == 0 ||
+ arg.compare(0,4,"-spy") == 0 ||
+ arg.compare(0,5,"-attr") == 0 ||
+ arg.compare(0,6,"-array") == 0 ) header_files.insert(string(argv[++i]));
+ else if (arg.compare(0,7,"-outdir") == 0) iv_outdir = argv[++i];
+ else if (arg.compare(0,2,"-o") == 0) iv_outfile = argv[++i]; //dg003a
+ else if (arg.compare(0,3,"-if") == 0) iv_source_path = argv[++i];
+ else if (arg.compare(0,3,"-ec") == 0) iv_ec = strtoul(argv[++i],NULL,16); //dg002a
+ else if (arg.compare(0,9,"--compare") == 0)
+ {
+ compare.first = argv[++i];
+ compare.second = argv[++i];
+ }
+ else if (arg.compare(0,7,"--debug") == 0) iv_dbg = true;
+
+ }
+ if(iv_source_path.size() == 0) iv_source_path = compare.first;
+
+ if(!narg) // TEST MODE
+ {
+ iv_source_path = "p7.initfile";
+ header_files.insert("p7_init_spies.h");
+ header_files.insert("p7_init_arrays.h");
+ header_files.insert("ciniIfSymbols.H");
+ }
+
+ size_t pos = iv_source_path.rfind('.');
+ if(pos != string::npos)
+ {
+ string type = iv_source_path.substr(pos+1);
+ if(type.compare(0,2,"if") == 0) iv_type = IF_TYPE;
+ else if(type.compare(0,8,"initfile") == 0) iv_type = INITFILE_TYPE;
+
+ size_t pos1 = iv_source_path.rfind('/',pos);
+ if(pos1 == string::npos) pos1 = 0;
+ else ++pos1;
+
+ iv_initfile = iv_source_path.substr(pos1,pos-pos1);
+ }
+
+ if(iv_outdir.length() == 0) iv_outdir.push_back('.');
+ if(iv_outdir.at(iv_outdir.size()-1) != '/') iv_outdir.push_back('/');
+
+ if(iv_outfile.size() == 0)
+ {
+ iv_outfile.append(iv_initfile);
+ iv_outfile.append(".if");
+ }
+
+ iv_outfile.insert(0,iv_outdir);
+
+ stats << "*********************************************************" << endl;
+ stats << "* source: " << iv_source_path << endl;
+ stats << "* listing: " << listing_fn() << endl;
+ stats << "* attr: " << attr_listing_fn() << endl;
+ stats << "* binary: " << binseq_fn() << endl;
+
+ iv_scomlist = new ScomList(iv_source_path, header_files, stats, iv_ec); //dg002c
+ if(compare.second.size())
+ {
+ ScomList cmplist(compare.second, header_files, stats, iv_ec); //dg002c
+ if(iv_scomlist->compare(cmplist))
+ {
+ cout << "Compare SUCCESS" << endl;
+ }
+ else
+ {
+ cout << stats;
+ }
+ }
+
+ iv_list_ostream.open(listing_fn().c_str());
+ if(!iv_list_ostream)
+ {
+ throw invalid_argument(string("ERROR! Could not open ") + listing_fn());
+ }
+
+ iv_attr_list_ostream.open(attr_listing_fn().c_str());
+ if(!iv_attr_list_ostream)
+ {
+ throw invalid_argument(string("ERROR! Could not open ") + attr_listing_fn());
+ }
+}
+
+Parser::~Parser()
+{
+ iv_list_ostream.close();
+ iv_attr_list_ostream.close();
+}
+
+void Parser::capture_dbg()
+{
+ if(iv_dbg)
+ {
+ string fname(iv_outdir);
+ fname.append(iv_initfile);
+ fname.append(".dbg");
+ ofstream dbgfs(fname.c_str());
+ if(!dbgfs)
+ {
+ string msg("Can't open ");
+ msg.append(fname);
+ throw invalid_argument(msg);
+ }
+ dbgfs << dbg.str() << endl;
+ dbgfs.close();
+ }
+}
+
+// TODO
+// - Detect all errors down to a line # ?
+// - bad rows/cols check - have already?
+//
OpenPOWER on IntegriCloud