| ... | @@ -1716,18 +1716,18 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl, | ... | @@ -1716,18 +1716,18 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl, |
| 1716 | { | 1716 | { |
| 1717 | AstNode *opaque_node = trans_create_node_opaque(c); | 1717 | AstNode *opaque_node = trans_create_node_opaque(c); |
| 1718 | if (full_type_name == nullptr) { | 1718 | if (full_type_name == nullptr) { |
| 1719 | c->decl_table.put(enum_decl, opaque_node); | 1719 | c->decl_table.put(enum_decl->getCanonicalDecl(), opaque_node); |
| 1720 | return opaque_node; | 1720 | return opaque_node; |
| 1721 | } | 1721 | } |
| 1722 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); | 1722 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); |
| 1723 | add_global_weak_alias(c, bare_name, full_type_name); | 1723 | add_global_weak_alias(c, bare_name, full_type_name); |
| 1724 | add_global_var(c, full_type_name, opaque_node); | 1724 | add_global_var(c, full_type_name, opaque_node); |
| 1725 | c->decl_table.put(enum_decl, symbol_node); | 1725 | c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node); |
| 1726 | return symbol_node; | 1726 | return symbol_node; |
| 1727 | } | 1727 | } |
| 1728 | | 1728 | |
| 1729 | static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { | 1729 | static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { |
| 1730 | auto existing_entry = c->decl_table.maybe_get((void*)enum_decl); | 1730 | auto existing_entry = c->decl_table.maybe_get((void*)enum_decl->getCanonicalDecl()); |
| 1731 | if (existing_entry) { | 1731 | if (existing_entry) { |
| 1732 | return existing_entry->value; | 1732 | return existing_entry->value; |
| 1733 | } | 1733 | } |
| ... | @@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { | ... | @@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { |
| 1792 | } | 1792 | } |
| 1793 | | 1793 | |
| 1794 | if (is_anonymous) { | 1794 | if (is_anonymous) { |
| 1795 | c->decl_table.put(enum_decl, enum_node); | 1795 | c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node); |
| 1796 | return enum_node; | 1796 | return enum_node; |
| 1797 | } else { | 1797 | } else { |
| 1798 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); | 1798 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); |
| 1799 | add_global_weak_alias(c, bare_name, full_type_name); | 1799 | add_global_weak_alias(c, bare_name, full_type_name); |
| 1800 | add_global_var(c, full_type_name, enum_node); | 1800 | add_global_var(c, full_type_name, enum_node); |
| 1801 | c->decl_table.put(enum_decl, symbol_node); | 1801 | c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node); |
| 1802 | return enum_node; | 1802 | return enum_node; |
| 1803 | } | 1803 | } |
| 1804 | } | 1804 | } |
| ... | @@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { | ... | @@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { |
| 1822 | } | 1822 | } |
| 1823 | | 1823 | |
| 1824 | if (is_anonymous) { | 1824 | if (is_anonymous) { |
| 1825 | c->decl_table.put(enum_decl, enum_node); | 1825 | c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node); |
| 1826 | return enum_node; | 1826 | return enum_node; |
| 1827 | } else { | 1827 | } else { |
| 1828 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); | 1828 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); |
| ... | @@ -1837,18 +1837,18 @@ static AstNode *demote_struct_to_opaque(Context *c, const RecordDecl *record_dec | ... | @@ -1837,18 +1837,18 @@ static AstNode *demote_struct_to_opaque(Context *c, const RecordDecl *record_dec |
| 1837 | { | 1837 | { |
| 1838 | AstNode *opaque_node = trans_create_node_opaque(c); | 1838 | AstNode *opaque_node = trans_create_node_opaque(c); |
| 1839 | if (full_type_name == nullptr) { | 1839 | if (full_type_name == nullptr) { |
| 1840 | c->decl_table.put(record_decl, opaque_node); | 1840 | c->decl_table.put(record_decl->getCanonicalDecl(), opaque_node); |
| 1841 | return opaque_node; | 1841 | return opaque_node; |
| 1842 | } | 1842 | } |
| 1843 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); | 1843 | AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); |
| 1844 | add_global_weak_alias(c, bare_name, full_type_name); | 1844 | add_global_weak_alias(c, bare_name, full_type_name); |
| 1845 | add_global_var(c, full_type_name, opaque_node); | 1845 | add_global_var(c, full_type_name, opaque_node); |
| 1846 | c->decl_table.put(record_decl, symbol_node); | 1846 | c->decl_table.put(record_decl->getCanonicalDecl(), symbol_node); |
| 1847 | return symbol_node; | 1847 | return symbol_node; |
| 1848 | } | 1848 | } |
| 1849 | | 1849 | |
| 1850 | static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { | 1850 | static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { |
| 1851 | auto existing_entry = c->decl_table.maybe_get((void*)record_decl); | 1851 | auto existing_entry = c->decl_table.maybe_get((void*)record_decl->getCanonicalDecl()); |
| 1852 | if (existing_entry) { | 1852 | if (existing_entry) { |
| 1853 | return existing_entry->value; | 1853 | return existing_entry->value; |
| 1854 | } | 1854 | } |
| ... | @@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { | ... | @@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { |
| 1857 | | 1857 | |
| 1858 | if (!record_decl->isStruct()) { | 1858 | if (!record_decl->isStruct()) { |
| 1859 | emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name); | 1859 | emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name); |
| 1860 | c->decl_table.put(record_decl, nullptr); | 1860 | c->decl_table.put(record_decl->getCanonicalDecl(), nullptr); |
| 1861 | return nullptr; | 1861 | return nullptr; |
| 1862 | } | 1862 | } |
| 1863 | | 1863 | |
| ... | @@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { | ... | @@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { |
| 1895 | | 1895 | |
| 1896 | // must be before fields in case a circular reference happens | 1896 | // must be before fields in case a circular reference happens |
| 1897 | if (is_anonymous) { | 1897 | if (is_anonymous) { |
| 1898 | c->decl_table.put(record_decl, struct_node); | 1898 | c->decl_table.put(record_decl->getCanonicalDecl(), struct_node); |
| 1899 | } else { | 1899 | } else { |
| 1900 | c->decl_table.put(record_decl, trans_create_node_symbol(c, full_type_name)); | 1900 | c->decl_table.put(record_decl->getCanonicalDecl(), trans_create_node_symbol(c, full_type_name)); |
| 1901 | } | 1901 | } |
| 1902 | | 1902 | |
| 1903 | uint32_t i = 0; | 1903 | uint32_t i = 0; |
| ... | @@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) { | ... | @@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) { |
| 2189 | static void process_preprocessor_entities(Context *c, ASTUnit &unit) { | 2189 | static void process_preprocessor_entities(Context *c, ASTUnit &unit) { |
| 2190 | CTokenize ctok = {{0}}; | 2190 | CTokenize ctok = {{0}}; |
| 2191 | | 2191 | |
| | 2192 | // TODO if we see #undef, delete it from the table |
| | 2193 | |
| 2192 | for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) { | 2194 | for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) { |
| 2193 | switch (entity->getKind()) { | 2195 | switch (entity->getKind()) { |
| 2194 | case PreprocessedEntity::InvalidKind: | 2196 | case PreprocessedEntity::InvalidKind: |