Implement string comparison

This commit is contained in:
2025-02-12 00:56:21 +01:00
parent 33aca4cc07
commit cd949c4be7
11 changed files with 287 additions and 321 deletions

View File

@ -19,6 +19,7 @@ along with GCC; see the file COPYING3. If not see
#include "elna/gcc/elna-diagnostic.h"
#include "elna/gcc/elna1.h"
#include "function.h"
#include "stor-layout.h"
#include "fold-const.h"
#include "diagnostic-core.h"
@ -39,6 +40,11 @@ namespace gcc
return TREE_CODE(type) == INTEGER_TYPE;
}
bool is_numeric_type(tree type)
{
return is_integral_type(type) || type == elna_float_type_node;
}
bool are_compatible_pointers(tree lhs, tree rhs)
{
tree lhs_type = TREE_TYPE(lhs);
@ -48,90 +54,42 @@ namespace gcc
|| (is_pointer_type(lhs_type) && lhs_type == rhs_type);
}
tree tree_chain_base::head()
void append_statement(tree statement_tree)
{
return first;
}
void tree_chain_base::append(tree t)
{
gcc_assert(t != NULL_TREE);
if (this->first == NULL_TREE)
if (!vec_safe_is_empty(f_binding_level->defers))
{
this->first = this->last = t;
append_to_statement_list(statement_tree, &f_binding_level->defers->begin()->try_statements);
}
else
{
chain(t);
this->last = t;
append_to_statement_list(statement_tree, &f_binding_level->statement_list);
}
}
void tree_chain::chain(tree t)
void defer(tree statement_tree)
{
TREE_CHAIN(this->last) = t;
defer_scope new_defer{ statement_tree, alloc_stmt_list() };
vec_safe_insert(f_binding_level->defers, 0, new_defer);
}
void block_chain::chain(tree t)
tree chain_defer()
{
BLOCK_CHAIN(this->last) = t;
}
tree_symbol_mapping::tree_symbol_mapping(tree bind_expression, tree block)
: m_bind_expression(bind_expression), m_block(block)
{
}
tree tree_symbol_mapping::bind_expression()
{
return m_bind_expression;
}
tree tree_symbol_mapping::block()
{
return m_block;
}
block_scope::block_scope()
: m_statement_list(alloc_stmt_list())
{
}
void block_scope::append_statement(tree statement_tree)
{
if (!defers.empty())
if (vec_safe_is_empty(f_binding_level->defers))
{
append_to_statement_list(statement_tree, &this->defers.front().second);
return f_binding_level->statement_list;
}
else
{
append_to_statement_list(statement_tree, &this->m_statement_list);
}
}
defer_scope *defer_iterator = f_binding_level->defers->begin();
tree defer_tree = build2(TRY_FINALLY_EXPR, void_type_node,
defer_iterator->try_statements, defer_iterator->defer_block);
int i;
void block_scope::defer(tree statement_tree)
{
defers.push_front({ statement_tree, alloc_stmt_list() });
}
tree block_scope::chain_defer()
{
if (this->defers.empty())
FOR_EACH_VEC_ELT_FROM(*f_binding_level->defers, i, defer_iterator, 1)
{
return m_statement_list;
append_to_statement_list(defer_tree, &defer_iterator->try_statements);
defer_tree = build2(TRY_FINALLY_EXPR, void_type_node,
defer_iterator->try_statements, defer_iterator->defer_block);
}
std::forward_list<std::pair<tree, tree>>::iterator defer_iterator =
this->defers.begin();
tree defer_tree = build2(TRY_FINALLY_EXPR, void_type_node, defer_iterator->second, defer_iterator->first);
++defer_iterator;
for (; defer_iterator != this->defers.end(); ++defer_iterator)
{
append_to_statement_list(defer_tree, &defer_iterator->second);
defer_tree = build2(TRY_FINALLY_EXPR, void_type_node, defer_iterator->second, defer_iterator->first);
}
return build2(COMPOUND_EXPR, TREE_TYPE(defer_tree), m_statement_list, defer_tree);
return build2(COMPOUND_EXPR, TREE_TYPE(defer_tree), f_binding_level->statement_list, defer_tree);
}
tree build_field(location_t location, tree record_type, const std::string name, tree type)