Пример #1
0
type_t *get_qualified_type(type_t *orig_type, type_qualifiers_t const qual)
{
	type_t *type = skip_typeref(orig_type);

	type_t *copy;
	if (is_type_array(type)) {
		/* For array types the element type has to be adjusted */
		type_t *element_type      = type->array.element_type;
		type_t *qual_element_type = get_qualified_type(element_type, qual);

		if (qual_element_type == element_type)
			return orig_type;

		copy                     = duplicate_type(type);
		copy->array.element_type = qual_element_type;
	} else if (is_type_valid(type)) {
		if ((type->base.qualifiers & qual) == (int)qual)
			return orig_type;

		copy                   = duplicate_type(type);
		copy->base.qualifiers |= qual;
	} else {
		return type;
	}

	return identify_new_type(copy);
}
Пример #2
0
VariableSymbol* NodeBuilder::new_var(LString name,
				     DataType* dtype,
				     bool addr_taken)
{
  VariableSymbol* sym = create_variable_symbol(_suif_env,
					       get_qualified_type(dtype),
					       name,
					       addr_taken);
  _symtab->add_symbol(sym);
  return sym;
}
Пример #3
0
MultiValueBlock* NodeBuilder::new_cstr_value_block(String s)
{
  ArrayType* type =
    _type_builder->get_array_type(get_qualified_type(get_char_type()),
				  IInteger(0),
				  IInteger(s.length()+1));
  MultiValueBlock* mb = create_multi_value_block(_suif_env, type);
  IInteger charlen = get_char_type()->get_bit_size();
  IInteger offset(0);
  for (int i =0; i<s.length(); i++) {
    mb->add_sub_block(offset,
		      create_expression_value_block(_suif_env,
						    char_const(s[i])));
    offset += charlen;
  }
  mb->add_sub_block(offset,
		    create_expression_value_block(_suif_env,
						  char_const('\0')));
  return mb;
}
Пример #4
0
Qualified_type&
Builder::get_volatile_type(Type& t)
{
  return get_qualified_type(t, volatile_qual);
}
Пример #5
0
Qualified_type&
Builder::get_const_type(Type& t)
{
  return get_qualified_type(t, const_qual);
}