* c-tree.h (c_default_pointer_mode): New variable.
* c-decl.c (c_default_pointer_mode): New variable.
(c_build_pointer_type): New function.
(grokdeclarator): Call c_build_pointer_type instead
of build_pointer_type.
* config/vms/vms-c.c: Include c-tree.h
(saved_pointer_mode): New variable.
(handle_pragma_pointer_size): New function.
(vms_pragma_pointer_size, vms_pragma_required_pointer_size): Likewise.
(vms_c_register_pragma): Register __pointer_size and
__required_pointer_size pragmas.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185136
138bc75d-0d04-0410-961f-
82ee72b054a4
2012-03-09 Tristan Gingold <gingold@adacore.com>
+ * c-tree.h (c_default_pointer_mode): New variable.
+ * c-decl.c (c_default_pointer_mode): New variable.
+ (c_build_pointer_type): New function.
+ (grokdeclarator): Call c_build_pointer_type instead
+ of build_pointer_type.
+
+ * config/vms/vms-c.c: Include c-tree.h
+ (saved_pointer_mode): New variable.
+ (handle_pragma_pointer_size): New function.
+ (vms_pragma_pointer_size, vms_pragma_required_pointer_size): Likewise.
+ (vms_c_register_pragma): Register __pointer_size and
+ __required_pointer_size pragmas.
+
+2012-03-09 Tristan Gingold <gingold@adacore.com>
+
* config/vms/vms-c.c (vms_construct_include_filename): New function.
(vms_c_register_includes): Reference it.
static bool undef_nested_function;
+/* Mode used to build pointers (VOIDmode means ptr_mode). */
+
+enum machine_mode c_default_pointer_mode = VOIDmode;
+
\f
/* Each c_binding structure describes one binding of an identifier to
a decl. All the decls in a scope - irrespective of namespace - are
return t;
}
\f
+/* Build a pointer type using the default pointer mode. */
+
+static tree
+c_build_pointer_type (tree to_type)
+{
+ addr_space_t as = to_type == error_mark_node? ADDR_SPACE_GENERIC
+ : TYPE_ADDR_SPACE (to_type);
+ enum machine_mode pointer_mode;
+
+ if (as != ADDR_SPACE_GENERIC || c_default_pointer_mode == VOIDmode)
+ pointer_mode = targetm.addr_space.pointer_mode (as);
+ else
+ pointer_mode = c_default_pointer_mode;
+ return build_pointer_type_for_mode (to_type, pointer_mode, false);
+}
+
+\f
/* Return true if we will want to say something if a goto statement
crosses DECL. */
TYPE_NAME (type) = decl;
}
- type = build_pointer_type (type);
+ type = c_build_pointer_type (type);
/* Process type qualifiers (such as const or volatile)
that were given inside the `*'. */
type = TREE_TYPE (type);
if (type_quals)
type = c_build_qualified_type (type, type_quals);
- type = build_pointer_type (type);
+ type = c_build_pointer_type (type);
type_quals = array_ptr_quals;
if (type_quals)
type = c_build_qualified_type (type, type_quals);
"ISO C forbids qualified function types");
if (type_quals)
type = c_build_qualified_type (type, type_quals);
- type = build_pointer_type (type);
+ type = c_build_pointer_type (type);
type_quals = TYPE_UNQUALIFIED;
}
else if (type_quals)
extern int system_header_p;
+/* Mode used to build pointers (VOIDmode means ptr_mode). */
+
+extern enum machine_mode c_default_pointer_mode;
+
/* In c-decl.c */
extern void c_finish_incomplete_decl (tree);
extern void c_write_global_declarations (void);
#include "tree.h"
#include "c-family/c-pragma.h"
#include "c-family/c-common.h"
+#include "c-tree.h"
#include "toplev.h"
#include "ggc.h"
#include "tm_p.h"
}
}
+/* #pragma __pointer_size */
+
+static enum machine_mode saved_pointer_mode;
+
+static void
+handle_pragma_pointer_size (const char *pragma_name)
+{
+ enum cpp_ttype tok;
+ tree x;
+
+ tok = pragma_lex (&x);
+ if (tok == CPP_NAME)
+ {
+ const char *op = IDENTIFIER_POINTER (x);
+
+ if (!strcmp (op, "__save"))
+ saved_pointer_mode = c_default_pointer_mode;
+ else if (!strcmp (op, "__restore"))
+ c_default_pointer_mode = saved_pointer_mode;
+ else if (!strcmp (op, "__short"))
+ c_default_pointer_mode = SImode;
+ else if (!strcmp (op, "__long"))
+ c_default_pointer_mode = DImode;
+ else
+ error ("malformed %<#pragma %s%>, ignoring", pragma_name);
+ }
+ else if (tok == CPP_NUMBER)
+ {
+ int val;
+
+ if (TREE_CODE (x) == INTEGER_CST)
+ val = TREE_INT_CST_LOW (x);
+ else
+ val = -1;
+
+ if (val == 32)
+ c_default_pointer_mode = SImode;
+ else if (val == 64)
+ c_default_pointer_mode = DImode;
+ else
+ error ("invalid constant in %<#pragma %s%>", pragma_name);
+ }
+ else
+ {
+ error ("malformed %<#pragma %s%>, ignoring", pragma_name);
+ }
+}
+
+static void
+vms_pragma_pointer_size (cpp_reader * ARG_UNUSED (dummy))
+{
+ /* Ignore if 32 bit only. */
+ if (POINTER_SIZE != 64)
+ return;
+
+ handle_pragma_pointer_size ("pointer_size");
+}
+
+static void
+vms_pragma_required_pointer_size (cpp_reader * ARG_UNUSED (dummy))
+{
+ handle_pragma_pointer_size ("required_pointer_size");
+}
+
/* Add vms-specific pragma. */
void
vms_pragma_nomember_alignment);
c_register_pragma_with_expansion (NULL, "nomember_alignment",
vms_pragma_nomember_alignment);
+ c_register_pragma (NULL, "__pointer_size",
+ vms_pragma_pointer_size);
+ c_register_pragma (NULL, "__required_pointer_size",
+ vms_pragma_required_pointer_size);
c_register_pragma (NULL, "__extern_model", vms_pragma_extern_model);
c_register_pragma (NULL, "extern_model", vms_pragma_extern_model);
c_register_pragma (NULL, "__message", vms_pragma_message);