| ... | @@ -40,6 +40,7 @@ struct Context { | ... | @@ -40,6 +40,7 @@ struct Context { |
| 40 | SourceManager *source_manager; | 40 | SourceManager *source_manager; |
| 41 | ZigList<AstNode *> aliases; | 41 | ZigList<AstNode *> aliases; |
| 42 | ZigList<MacroSymbol> macro_symbols; | 42 | ZigList<MacroSymbol> macro_symbols; |
| | 43 | uint32_t *next_node_index; |
| 43 | }; | 44 | }; |
| 44 | | 45 | |
| 45 | static AstNode *make_qual_type_node(Context *c, QualType qt, const Decl *decl); | 46 | static AstNode *make_qual_type_node(Context *c, QualType qt, const Decl *decl); |
| ... | @@ -76,6 +77,8 @@ static AstNode *create_node(Context *c, NodeType type) { | ... | @@ -76,6 +77,8 @@ static AstNode *create_node(Context *c, NodeType type) { |
| 76 | AstNode *node = allocate<AstNode>(1); | 77 | AstNode *node = allocate<AstNode>(1); |
| 77 | node->type = type; | 78 | node->type = type; |
| 78 | node->owner = c->import; | 79 | node->owner = c->import; |
| | 80 | node->create_index = *c->next_node_index; |
| | 81 | *c->next_node_index += 1; |
| 79 | return node; | 82 | return node; |
| 80 | } | 83 | } |
| 81 | | 84 | |
| ... | @@ -398,7 +401,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, | ... | @@ -398,7 +401,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, |
| 398 | { | 401 | { |
| 399 | const RecordType *record_ty = static_cast<const RecordType*>(ty); | 402 | const RecordType *record_ty = static_cast<const RecordType*>(ty); |
| 400 | Buf *record_name = buf_create_from_str(decl_name(record_ty->getDecl())); | 403 | Buf *record_name = buf_create_from_str(decl_name(record_ty->getDecl())); |
| 401 | if (type_table->maybe_get(record_name)) { | 404 | if (buf_len(record_name) == 0) { |
| | 405 | emit_warning(c, decl, "unhandled anonymous struct"); |
| | 406 | return nullptr; |
| | 407 | } else if (type_table->maybe_get(record_name)) { |
| 402 | const char *prefix_str; | 408 | const char *prefix_str; |
| 403 | if (type_table == &c->enum_type_table) { | 409 | if (type_table == &c->enum_type_table) { |
| 404 | prefix_str = "enum_"; | 410 | prefix_str = "enum_"; |
| ... | @@ -416,7 +422,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, | ... | @@ -416,7 +422,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, |
| 416 | { | 422 | { |
| 417 | const EnumType *enum_ty = static_cast<const EnumType*>(ty); | 423 | const EnumType *enum_ty = static_cast<const EnumType*>(ty); |
| 418 | Buf *record_name = buf_create_from_str(decl_name(enum_ty->getDecl())); | 424 | Buf *record_name = buf_create_from_str(decl_name(enum_ty->getDecl())); |
| 419 | if (type_table->maybe_get(record_name)) { | 425 | if (buf_len(record_name) == 0) { |
| | 426 | emit_warning(c, decl, "unhandled anonymous enum"); |
| | 427 | return nullptr; |
| | 428 | } else if (type_table->maybe_get(record_name)) { |
| 420 | const char *prefix_str; | 429 | const char *prefix_str; |
| 421 | if (type_table == &c->enum_type_table) { | 430 | if (type_table == &c->enum_type_table) { |
| 422 | prefix_str = "enum_"; | 431 | prefix_str = "enum_"; |
| ... | @@ -560,6 +569,10 @@ static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) | ... | @@ -560,6 +569,10 @@ static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) |
| 560 | return; | 569 | return; |
| 561 | } | 570 | } |
| 562 | | 571 | |
| | 572 | // if the underlying type is anonymous, we can special case it to just |
| | 573 | // use the name of this typedef |
| | 574 | // TODO |
| | 575 | |
| 563 | add_typedef_node(c, type_name, make_qual_type_node(c, child_qt, typedef_decl)); | 576 | add_typedef_node(c, type_name, make_qual_type_node(c, child_qt, typedef_decl)); |
| 564 | } | 577 | } |
| 565 | | 578 | |
| ... | @@ -650,13 +663,24 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) { | ... | @@ -650,13 +663,24 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) { |
| 650 | } | 663 | } |
| 651 | | 664 | |
| 652 | static void visit_record_decl(Context *c, const RecordDecl *record_decl) { | 665 | static void visit_record_decl(Context *c, const RecordDecl *record_decl) { |
| 653 | Buf *bare_name = buf_create_from_str(decl_name(record_decl)); | 666 | const char *raw_name = decl_name(record_decl); |
| | 667 | |
| | 668 | if (record_decl->isAnonymousStructOrUnion() || raw_name[0] == 0) { |
| | 669 | return; |
| | 670 | } |
| | 671 | |
| | 672 | Buf *bare_name = buf_create_from_str(raw_name); |
| 654 | | 673 | |
| 655 | if (!record_decl->isStruct()) { | 674 | if (!record_decl->isStruct()) { |
| 656 | emit_warning(c, record_decl, "skipping record %s, not a struct", buf_ptr(bare_name)); | 675 | emit_warning(c, record_decl, "skipping record %s, not a struct", buf_ptr(bare_name)); |
| 657 | return; | 676 | return; |
| 658 | } | 677 | } |
| 659 | | 678 | |
| | 679 | if (buf_len(bare_name) == 0) { |
| | 680 | emit_warning(c, record_decl, "skipping anonymous struct"); |
| | 681 | return; |
| | 682 | } |
| | 683 | |
| 660 | Buf *full_type_name = buf_sprintf("struct_%s", buf_ptr(bare_name)); | 684 | Buf *full_type_name = buf_sprintf("struct_%s", buf_ptr(bare_name)); |
| 661 | | 685 | |
| 662 | if (c->struct_type_table.maybe_get(bare_name)) { | 686 | if (c->struct_type_table.maybe_get(bare_name)) { |
| ... | @@ -1030,7 +1054,8 @@ static void process_preprocessor_entities(Context *c, ASTUnit &unit) { | ... | @@ -1030,7 +1054,8 @@ static void process_preprocessor_entities(Context *c, ASTUnit &unit) { |
| 1030 | } | 1054 | } |
| 1031 | | 1055 | |
| 1032 | int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *source, | 1056 | int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *source, |
| 1033 | const char **args, int args_len, const char *libc_include_path, bool warnings_on) | 1057 | const char **args, int args_len, const char *libc_include_path, bool warnings_on, |
| | 1058 | uint32_t *next_node_index) |
| 1034 | { | 1059 | { |
| 1035 | int err; | 1060 | int err; |
| 1036 | Buf tmp_file_path = BUF_INIT; | 1061 | Buf tmp_file_path = BUF_INIT; |
| ... | @@ -1047,7 +1072,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour | ... | @@ -1047,7 +1072,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour |
| 1047 | clang_argv.append(args[i]); | 1072 | clang_argv.append(args[i]); |
| 1048 | } | 1073 | } |
| 1049 | | 1074 | |
| 1050 | err = parse_h_file(import, errors, &clang_argv, warnings_on); | 1075 | err = parse_h_file(import, errors, &clang_argv, warnings_on, next_node_index); |
| 1051 | | 1076 | |
| 1052 | os_delete_file(&tmp_file_path); | 1077 | os_delete_file(&tmp_file_path); |
| 1053 | | 1078 | |
| ... | @@ -1055,7 +1080,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour | ... | @@ -1055,7 +1080,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour |
| 1055 | } | 1080 | } |
| 1056 | | 1081 | |
| 1057 | int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, | 1082 | int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, |
| 1058 | ZigList<const char *> *clang_argv, bool warnings_on) | 1083 | ZigList<const char *> *clang_argv, bool warnings_on, uint32_t *next_node_index) |
| 1059 | { | 1084 | { |
| 1060 | Context context = {0}; | 1085 | Context context = {0}; |
| 1061 | Context *c = &context; | 1086 | Context *c = &context; |
| ... | @@ -1068,6 +1093,7 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, | ... | @@ -1068,6 +1093,7 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, |
| 1068 | c->struct_type_table.init(8); | 1093 | c->struct_type_table.init(8); |
| 1069 | c->fn_table.init(8); | 1094 | c->fn_table.init(8); |
| 1070 | c->macro_table.init(8); | 1095 | c->macro_table.init(8); |
| | 1096 | c->next_node_index = next_node_index; |
| 1071 | | 1097 | |
| 1072 | char *ZIG_PARSEH_CFLAGS = getenv("ZIG_PARSEH_CFLAGS"); | 1098 | char *ZIG_PARSEH_CFLAGS = getenv("ZIG_PARSEH_CFLAGS"); |
| 1073 | if (ZIG_PARSEH_CFLAGS) { | 1099 | if (ZIG_PARSEH_CFLAGS) { |