+2002-05-16 Zack Weinberg <zack@codesourcery.com>
+
+ * c-common.c (STDC_0_IN_SYSTEM_HEADERS, REGISTER_PREFIX):
+ Default-define here.
+ (builtin_define_with_value): Can now wrap the expansion in
+ quotation marks if such is wanted.
+ (cb_register_builtins): Update calls to builtin_define_with_value.
+ Define __REGISTER_PREFIX__, __USER_LABEL_PREFIX__, and __VERSION__
+ here.
+ (c_common_init): Set options->stdc_0_in_system_headers.
+ * c-lex.h: Update prototype of builtin_define_with_value.
+ * cppdefault.h: Remove default definitions of USER_LABEL_PREFIX
+ and REGISTER_PREFIX.
+
+ * cppinit.c (VERS, ULP, C, X): Kill.
+ (builtin_array): Remove entries for __VERSION__,
+ __USER_LABEL_PREFIX__, __REGISTER_PREFIX__, and
+ __HAVE_BUILTIN_SETJMP__. Make __STDC__ always a builtin, not
+ a constant.
+ (init_builtins): Kill off a bunch of now-dead code.
+ (COMMAND_LINE_OPTIONS): Remove -fleading-underscore and
+ -fno-leading-underscore.
+ (cpp_handle_option): Remove code to set user_label_prefix.
+ (cpp_post_options): Likewise.
+
+ * cpplib.h (struct cpp_options): Remove user_label_prefix.
+ (stdc_0_in_system_headers): New.
+ * cppmacro.c (builtin_macro): Check CPP_OPTION (pfile,
+ stdc_0_in_system_headers) too to decide the value of __STDC__.
+
+ * tradcpp.c (user_label_prefix): Kill.
+ (main): Remove code handling -f(no-)leading-underscore.
+ (initialize_builtins): Don't define __REGISTER_PREFIX__
+ or __USER_LABEL_PREFIX__.
+ (install_value): Wrap compound statement in dummy loop so the
+ macro works properly in an if statement.
+
+
2002-05-16 Janis Johnson <janis187@us.ibm.com>
* loop.h (struct loop_info): Add member has_prefetch.
: "long long unsigned int"))
#endif
+#ifndef STDC_0_IN_SYSTEM_HEADERS
+#define STDC_0_IN_SYSTEM_HEADERS 0
+#endif
+
+#ifndef REGISTER_PREFIX
+#define REGISTER_PREFIX ""
+#endif
+
/* The variant of the C language being processed. */
enum c_language_kind c_language;
cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
/* stddef.h needs to know these. */
- builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE);
- builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE);
- builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE);
- builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE);
+ builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
+ builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
+ builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
+ builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
+
+ /* For use in assembly language. */
+ builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
+ builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
+
+ /* Misc. */
+ builtin_define_with_value ("__VERSION__", version_string, 1);
/* A straightforward target hook doesn't work, because of problems
linking that hook's body when part of non-C front ends. */
}
}
-/* Pass an object-like macro and a value to define it to. */
+/* Pass an object-like macro and a value to define it to. The third
+ parameter says whether or not to turn the value into a string
+ constant. */
void
-builtin_define_with_value (macro, expansion)
+builtin_define_with_value (macro, expansion, is_str)
const char *macro;
const char *expansion;
+ int is_str;
{
- char *buf, *q;
+ char *buf;
size_t mlen = strlen (macro);
size_t elen = strlen (expansion);
+ size_t extra = 2; /* space for an = and a NUL */
- q = buf = alloca (mlen + elen + 2);
- memcpy (q, macro, mlen);
- q += mlen;
- *q++ = '=';
- memcpy (q, expansion, elen);
- q += elen;
- *q = '\0';
+ if (is_str)
+ extra += 2; /* space for two quote marks */
+
+ buf = alloca (mlen + elen + extra);
+ if (is_str)
+ sprintf (buf, "%s=\"%s\"", macro, expansion);
+ else
+ sprintf (buf, "%s=%s", macro, expansion);
cpp_define (parse_in, buf);
}
options->unsigned_char = !flag_signed_char; */
options->warn_multichar = warn_multichar;
+ options->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
/* Register preprocessor built-ins before calls to
cpp_main_file. */
"_mips". */
extern void builtin_define_std PARAMS ((const char *));
-/* Pass an object-like macro and a value to define it to. */
-extern void builtin_define_with_value PARAMS ((const char *, const char *));
+/* Pass an object-like macro and a value to define it to. The third
+ parameter says whether or not to turn the value into a string
+ constant. */
+extern void builtin_define_with_value PARAMS ((const char *, const char *,
+ int));
#endif /* ! GCC_C_LEX_H */
#undef CROSS_INCLUDE_DIR
#endif
-/* We let tm.h override the types used here, to handle trivial differences
- such as the choice of unsigned int or long unsigned int for size_t.
- When machines start needing nontrivial differences in the size type,
- it would be best to do something here to figure out automatically
- from other information what type to use. */
-
-/* The string value for __USER_LABEL_PREFIX__ */
-
-#ifndef USER_LABEL_PREFIX
-#define USER_LABEL_PREFIX ""
-#endif
-
-/* The string value for __REGISTER_PREFIX__ */
-
-#ifndef REGISTER_PREFIX
-#define REGISTER_PREFIX ""
-#endif
-
/* This is the default list of directories to search for include files.
It may be overridden by the various -I and -ixxx options.
known at build time should not be flagged BUILTIN, as then they do
not appear in macro dumps with e.g. -dM or -dD.
- Two values are not compile time constants, so we tag
- them in the FLAGS field instead:
- VERS value is the global version_string, quoted
- ULP value is the global user_label_prefix
-
Also, macros with CPLUS set in the flags field are entered only for C++. */
struct builtin
{
unsigned short flags;
unsigned short len;
};
-#define VERS 0x01
-#define ULP 0x02
#define CPLUS 0x04
#define BUILTIN 0x08
#define OPERATOR 0x10
#define B(n, t) { U n, 0, t, 0, BUILTIN, sizeof n - 1 }
-#define C(n, v) { U n, v, 0, 0, 0, sizeof n - 1 }
-#define X(n, f) { U n, 0, 0, 0, f, sizeof n - 1 }
#define O(n, c, f) { U n, 0, 0, c, OPERATOR | f, sizeof n - 1 }
static const struct builtin builtin_array[] =
{
B("__LINE__", BT_SPECLINE),
B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL),
B("_Pragma", BT_PRAGMA),
-
- X("__VERSION__", VERS),
- X("__USER_LABEL_PREFIX__", ULP),
- C("__REGISTER_PREFIX__", REGISTER_PREFIX),
- C("__HAVE_BUILTIN_SETJMP__", "1"),
-#ifdef STDC_0_IN_SYSTEM_HEADERS
B("__STDC__", BT_STDC),
-#else
- C("__STDC__", "1"),
-#endif
/* Named operators known to the preprocessor. These cannot be #defined
and always have their stated meaning. They are treated like normal
O("xor_eq", CPP_XOR_EQ, CPLUS)
};
#undef B
-#undef C
-#undef X
#undef O
#define builtin_array_end (builtin_array + ARRAY_SIZE (builtin_array))
for(b = builtin_array; b < builtin_array_end; b++)
{
+ cpp_hashnode *hp;
if ((b->flags & CPLUS) && ! CPP_OPTION (pfile, cplusplus))
continue;
if ((b->flags & OPERATOR) && ! CPP_OPTION (pfile, operator_names))
continue;
- if (b->flags & (OPERATOR | BUILTIN))
+ hp = cpp_lookup (pfile, b->name, b->len);
+ if (b->flags & OPERATOR)
{
- cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
- if (b->flags & OPERATOR)
- {
- hp->flags |= NODE_OPERATOR;
- hp->value.operator = b->operator;
- }
- else
- {
- hp->type = NT_MACRO;
- hp->flags |= NODE_BUILTIN | NODE_WARN;
- hp->value.builtin = b->builtin;
- }
+ hp->flags |= NODE_OPERATOR;
+ hp->value.operator = b->operator;
}
- else /* A standard macro of some kind. */
+ else
{
- const char *val;
- char *str;
-
- if (b->flags & VERS)
- {
- /* Allocate enough space for 'name "value"\n\0'. */
- str = alloca (b->len + strlen (version_string) + 5);
- sprintf (str, "%s \"%s\"\n", b->name, version_string);
- }
- else
- {
- if (b->flags & ULP)
- val = CPP_OPTION (pfile, user_label_prefix);
- else
- val = b->value;
-
- /* Allocate enough space for "name value\n\0". */
- str = alloca (b->len + strlen (val) + 3);
- sprintf(str, "%s %s\n", b->name, val);
- }
-
- _cpp_define_builtin (pfile, str);
+ hp->type = NT_MACRO;
+ hp->flags |= NODE_BUILTIN | NODE_WARN;
+ hp->value.builtin = b->builtin;
}
}
DEF_OPT("U", no_mac, OPT_U) \
DEF_OPT("W", no_arg, OPT_W) /* arg optional */ \
DEF_OPT("d", no_arg, OPT_d) \
- DEF_OPT("fleading-underscore", 0, OPT_fleading_underscore) \
- DEF_OPT("fno-leading-underscore", 0, OPT_fno_leading_underscore) \
DEF_OPT("fno-operator-names", 0, OPT_fno_operator_names) \
DEF_OPT("fno-preprocessed", 0, OPT_fno_preprocessed) \
DEF_OPT("fno-show-column", 0, OPT_fno_show_column) \
{
case N_OPTS: /* Shut GCC up. */
break;
- case OPT_fleading_underscore:
- CPP_OPTION (pfile, user_label_prefix) = "_";
- break;
- case OPT_fno_leading_underscore:
- CPP_OPTION (pfile, user_label_prefix) = "";
- break;
case OPT_fno_operator_names:
CPP_OPTION (pfile, operator_names) = 0;
break;
if (CPP_OPTION (pfile, cplusplus))
CPP_OPTION (pfile, warn_traditional) = 0;
- /* Set this if it hasn't been set already. */
- if (CPP_OPTION (pfile, user_label_prefix) == NULL)
- CPP_OPTION (pfile, user_label_prefix) = USER_LABEL_PREFIX;
-
/* Permanently disable macro expansion if we are rescanning
preprocessed text. */
if (CPP_OPTION (pfile, preprocessed))
const char *include_prefix;
unsigned int include_prefix_len;
- /* -fleading_underscore sets this to "_". */
- const char *user_label_prefix;
-
/* The language we're preprocessing. */
enum c_lang lang;
/* Nonzero means chars (wide chars) are unsigned. */
unsigned char unsigned_char, unsigned_wchar;
+
+ /* Nonzero means __STDC__ should have the value 0 in system headers. */
+ unsigned char stdc_0_in_system_headers;
};
/* Call backs. */
pfile->cur_token[-1].line));
break;
+ /* __STDC__ has the value 1 under normal circumstances.
+ However, if (a) we are in a system header, (b) the option
+ stdc_0_in_system_headers is true, and (c) __STRICT_ANSI__ is
+ not defined, then it has the value 0. */
case BT_STDC:
{
- int stdc = (!CPP_IN_SYSTEM_HEADER (pfile)
- || pfile->spec_nodes.n__STRICT_ANSI__->type != NT_VOID);
+ int stdc;
+ if (CPP_IN_SYSTEM_HEADER (pfile)
+ && CPP_OPTION (pfile, stdc_0_in_system_headers)
+ && pfile->spec_nodes.n__STRICT_ANSI__->type == NT_VOID)
+ stdc = 0;
+ else
+ stdc = 1;
+
result = new_number_token (pfile, stdc);
}
break;
int no_output;
-/* Value of __USER_LABEL_PREFIX__. Target-dependent, also controlled
- by -f(no-)leading-underscore. */
-static const char *user_label_prefix;
-
/* I/O buffer structure.
The `fname' field is nonzero for source files and #include files
and for the dummy text used for -D and -U.
break;
case 'f':
- if (!strcmp (argv[i], "-fleading-underscore"))
- user_label_prefix = "_";
- else if (!strcmp (argv[i], "-fno-leading-underscore"))
- user_label_prefix = "";
- else if (!strcmp (argv[i], "-fsigned-char"))
+ if (!strcmp (argv[i], "-fsigned-char"))
flag_signed_char = 1;
else if (!strcmp (argv[i], "-funsigned-char"))
flag_signed_char = 0;
&& (deps_missing_files || deps_file || print_deps_phony_targets))
fatal ("you must additionally specify either -M or -MM");
- if (user_label_prefix == 0)
- user_label_prefix = USER_LABEL_PREFIX;
-
if (print_deps)
{
/* Set the default target (if there is none already), and
#define DSC(x) U x, sizeof x - 1
#define install_spec(name, type) \
install(DSC(name), type, -1);
-#define install_value(name, val) \
- hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val;
+#define install_value(name, val) do { \
+ hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val; \
+} while (0)
static void
initialize_builtins ()
{
install_spec ("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL);
install_spec ("__LINE__", T_SPECLINE);
- install_value ("__REGISTER_PREFIX__", REGISTER_PREFIX);
- install_value ("__USER_LABEL_PREFIX__", user_label_prefix);
-
if (flag_signed_char == 0)
install_value ("__CHAR_UNSIGNED__", "1");
}