00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <antlr/CommonAST.hpp>
00035 #include <antlr/AST.hpp>
00036 #include <antlr/ASTFactory.hpp>
00037 #include "CLexer.hpp"
00038 #include "CParser.hpp"
00039 #include "AstConverter.hpp"
00040 #include "CToken.hpp"
00041 #include "LocationNode.hpp"
00042 #include "ctrump/ctrump.h"
00043 #include "ctrump/ast/abi.h"
00044 #include "ctrump/io/pretty-printer.h"
00045 #include "cfront.h"
00046 #include <fstream>
00047 #include <iostream>
00048
00049 using namespace cfront;
00050
00051 void
00052 makeTargetInfo(const ctrump_abi* abi, TargetInfo& info)
00053 {
00054 info.setSize(TargetInfo::POINTER, abi->sizeof_pointer);
00055 info.setSize(TargetInfo::BOOL, abi->sizeof_bool);
00056
00057 info.setSize(TargetInfo::SHORT, abi->sizeof_short);
00058 info.setSize(TargetInfo::INT, abi->sizeof_int);
00059 info.setSize(TargetInfo::LONG, abi->sizeof_long);
00060 info.setSize(TargetInfo::LLONG, abi->sizeof_longlong);
00061 info.setSize(TargetInfo::FLOAT, abi->sizeof_float);
00062 info.setSize(TargetInfo::DOUBLE, abi->sizeof_double);
00063
00064 info.setSize(TargetInfo::ENUM, abi->sizeof_enum);
00065 info.setSize(TargetInfo::VECTOR, abi->sizeof_vector);
00066
00067 info.setAlign(TargetInfo::POINTER, abi->alignof_pointer);
00068 info.setAlign(TargetInfo::BOOL, abi->alignof_bool);
00069
00070 info.setAlign(TargetInfo::SHORT, abi->alignof_short);
00071 info.setAlign(TargetInfo::INT, abi->alignof_int);
00072 info.setAlign(TargetInfo::LONG, abi->alignof_long);
00073 info.setAlign(TargetInfo::LLONG, abi->alignof_longlong);
00074 info.setAlign(TargetInfo::FLOAT, abi->alignof_float);
00075 info.setAlign(TargetInfo::DOUBLE, abi->alignof_double);
00076
00077 info.setAlign(TargetInfo::ENUM, abi->alignof_enum);
00078 info.setAlign(TargetInfo::VECTOR, abi->alignof_vector);
00079 }
00080
00081 void
00082 setInternalError(Logs& logs, const char* message, const Location* loc,
00083 const char* originalFilename)
00084 {
00085 int line = 0;
00086 int col = 0;
00087 const char* errorFilename = originalFilename;
00088 if (loc != NULL) {
00089 line = loc->line;
00090 col = loc->column;
00091 errorFilename = loc->filePath.c_str();
00092 }
00093 ERROR_BASIC(CTRUMP_ERR_INTERNAL_ERROR, "internal error: %s"
00094 , errorFilename, line, col, &logs, message, NULL);
00095 }
00096
00097 void
00098 convertLogs(Logs& logs, struct ctrump_loginfo** log_info, int* num_log_info,
00099 struct ctrump_mempool *tree_pool)
00100 {
00101 *num_log_info = logs.size();
00102 *log_info = (ctrump_loginfo*)
00103 ctrump_mempool_alloc(tree_pool,
00104 *num_log_info * sizeof(ctrump_loginfo));
00105 std::copy(logs.begin(), logs.end(), *log_info);
00106 }
00107
00108 int
00109 ctrump_parse(struct ctrump_loginfo** log_info,
00110 int* num_log_info,
00111 struct ctrump_translation_unit *result,
00112 const char *filename,
00113 const char *original_filename,
00114 struct ctrump_type_env *type_env,
00115 const struct ctrump_abi *abi,
00116 const struct ctrump_parser_option *option,
00117 int id_base,
00118 struct ctrump_mempool *tree_pool)
00119 {
00120 Logs logs;
00121 antlr::RefAST ast = NULL;
00122
00123 try {
00124 std::ifstream in(filename);
00125 if (!in.is_open()) {
00126 std::cerr << filename << " : No such file or directory.\n";
00127 return -1;
00128 }
00129 TargetInfo targetInfo;
00130 ParserLexerSharedState sharedState;
00131
00132 CLexer lexer(in);
00133 lexer.setTokenObjectFactory(CToken::factory);
00134 lexer.setParserSharedState(&sharedState);
00135 lexer.setCurrentSource(filename);
00136 lexer.setLine(1);
00137
00138 CAnalyzer analyzer;
00139 analyzer.initialize();
00140 analyzer.setLogs(&logs);
00141 makeTargetInfo(abi, targetInfo);
00142 analyzer.setTargetInfo(&targetInfo);
00143 analyzer.setSupportVectorExtension(option->is_vector_keyword != 0);
00144
00145 CParser parser(lexer);
00146 parser.setLogs(&logs);
00147 parser.setLexerSharedState(&sharedState);
00148 antlr::ASTFactory astFactory("ValueNode", ValueNode::factory);
00149 parser.initializeASTFactory(astFactory);
00150 analyzer.setASTFactory(&astFactory);
00151 parser.setASTFactory(&astFactory);
00152 parser.setAnalyzer(&analyzer);
00153
00154 parser.translationUnit();
00155
00156 ast = parser.getAST();
00157 } catch (UncontinuableError& e) {
00158
00159 } catch (InternalError& e) {
00160 setInternalError(logs, e.getMessage(), e.getLocation(),
00161 original_filename);
00162 } catch (antlr::ANTLRException& e) {
00163 ERROR_BASIC(CTRUMP_ERR_UNEXPECTED_PARSER_ERROR, "unexpected parser error."
00164 , original_filename, 0, 0, &logs, NULL);
00165 std::cout << "exception: " << e.getMessage() << std::endl;
00166 } catch (std::exception& e) {
00167 ERROR_BASIC(CTRUMP_ERR_UNEXPECTED_PARSER_ERROR, "unexpected parser error."
00168 , original_filename, 0, 0, &logs, NULL);
00169 std::cout << "exception: " << e.what() << std::endl;
00170 }
00171
00172 if (!logs.empty()) {
00173
00174 convertLogs(logs, log_info, num_log_info, tree_pool);
00175 return -1;
00176 }
00177
00178 #ifdef SHOW_AST
00179 if (ast != NULL) {
00180 std::cout << ast->toStringList() << std::endl;
00181 } else {
00182 std::cout << "(Error occured?)\n";
00183 }
00184 #endif
00185
00186 int numCreatedNodes = -1;
00187 try {
00188
00189 ctrump_init_all();
00190
00191 AstConverter converter(type_env, tree_pool, id_base, &logs);
00192 converter.translationUnit(RefNode(ast), result);
00193 result->filename = original_filename;
00194
00195 numCreatedNodes = converter.getNextId();
00196 } catch (InternalError& e) {
00197 setInternalError(logs, e.getMessage(), e.getLocation(),
00198 original_filename);
00199 } catch (antlr::ANTLRException e) {
00200 ERROR_BASIC(CTRUMP_ERR_UNEXPECTED_PARSER_ERROR, "unexpected parser error."
00201 ,filename, 0, 0, &logs, NULL);
00202
00203 } catch (std::exception& e) {
00204 ERROR_BASIC(CTRUMP_ERR_UNEXPECTED_PARSER_ERROR, "unexpected parser error."
00205 ,filename, 0, 0, &logs, NULL);
00206
00207 }
00208
00209 if (!logs.empty()) {
00210
00211 convertLogs(logs, log_info, num_log_info, tree_pool);
00212 return -1;
00213 }
00214 return numCreatedNodes;
00215 }
00216
00217
00218 void
00219 ctrump_get_default_parser_option(struct ctrump_parser_option *option)
00220 {
00221 option->is_vector_keyword = 1;
00222 option->tab_width = 4;
00223 }
00224
00225 #ifdef BUILD_CFRONT
00226
00227 extern "C" void ctrump_destroy_symtab(void);
00228
00229 #include <sys/time.h>
00230
00231 unsigned long long
00232 getTimeDiff(struct timeval* t1, struct timeval* t2)
00233 {
00234 unsigned long long tl1 =
00235 (unsigned long long) t1->tv_sec * 1000000 + t1->tv_usec;
00236 unsigned long long tl2 =
00237 (unsigned long long) t2->tv_sec * 1000000 + t2->tv_usec;
00238 return tl1 - tl2;
00239 }
00240
00241 int
00242 main(int argc, char** argv)
00243 {
00244 struct ctrump_translation_unit tuResult;
00245 struct ctrump_type_env type_env;
00246 struct ctrump_mempool tree_allocator;
00247 struct ctrump_loginfo* log_info;
00248 struct ctrump_parser_option option;
00249 int num_log_info;
00250 struct timeval tstart, tend;
00251
00252 if (argc < 2) {
00253 std::cerr << "no input files.\n";
00254 return 1;
00255 }
00256
00257 ctrump_type_env_init(&type_env, 0);
00258 ctrump_mempool_init(&tree_allocator, 1024);
00259 ctrump_get_default_parser_option(&option);
00260
00261 gettimeofday(&tstart, NULL);
00262 int res = ctrump_parse(&log_info, &num_log_info, &tuResult, argv[1],
00263 argv[1], &type_env, &ctrump_ppc32_abi, &option,
00264 0, &tree_allocator);
00265 gettimeofday(&tend, NULL);
00266 std::cout << "<<all>> <(" << getTimeDiff(&tend, &tstart) << ")>\n";
00267 int resCode = 0;
00268 if (res < 0) {
00269 for (int i = 0; i < num_log_info; i++) {
00270 ctrump_report_log(&log_info[i]);
00271 ctrump_free_log(&log_info[i]);
00272 }
00273 resCode = 1;
00274 goto end;
00275 }
00276 #ifdef USE_PRETTY_PRINTER
00277 char* retStr;
00278 int retLen;
00279 ctrump_print_translation_unit(&retStr, &retLen, 0, 0, &tuResult);
00280 std::cout << retStr << std::endl;
00281 #endif
00282 ctrump_destroy_symtab();
00283 end:
00284 ctrump_type_env_destroy(&type_env);
00285 ctrump_mempool_destroy(&tree_allocator);
00286 return resCode;
00287 }
00288
00289 #endif