c-ppoutput.c (scan_translation_unit): Handle CPP_PRAGMA and CPP_PRAGMA_EOL.
* c-ppoutput.c (scan_translation_unit): Handle CPP_PRAGMA and CPP_PRAGMA_EOL. * c-pragma.c (pragma_ns_name): New typedef. (registered_pp_pragmas): New variable. (c_pp_lookup_pragma): New function. (c_register_pragma_1): If flag_preprocess_only, do nothing for non-expanded pragmas, for expanded ones push pragma's namespace and name into registered_pp_pragmas vector. (c_invoke_pragma_handler): Register OpenMP pragmas even when flag_preprocess_only, don't register GCC pch_preprocess pragma if flag_preprocess_only. * c-opts.c (c_common_init): Call init_pragma even if flag_preprocess_only. * c-pragma.c (c_pp_lookup_pragma): New prototype. * config/darwin.h (DARWIN_REGISTER_TARGET_PRAGMAS): Don't call cpp_register_pragma if flag_preprocess_only. * gcc.dg/gomp/preprocess-1.c: New test. From-SVN: r132703
This commit is contained in:
parent
9cc028fa79
commit
a25a8f3be3
8 changed files with 151 additions and 36 deletions
|
@ -1,3 +1,22 @@
|
|||
2008-02-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* c-ppoutput.c (scan_translation_unit): Handle CPP_PRAGMA
|
||||
and CPP_PRAGMA_EOL.
|
||||
* c-pragma.c (pragma_ns_name): New typedef.
|
||||
(registered_pp_pragmas): New variable.
|
||||
(c_pp_lookup_pragma): New function.
|
||||
(c_register_pragma_1): If flag_preprocess_only, do nothing
|
||||
for non-expanded pragmas, for expanded ones push pragma's
|
||||
namespace and name into registered_pp_pragmas vector.
|
||||
(c_invoke_pragma_handler): Register OpenMP pragmas even when
|
||||
flag_preprocess_only, don't register GCC pch_preprocess
|
||||
pragma if flag_preprocess_only.
|
||||
* c-opts.c (c_common_init): Call init_pragma even if
|
||||
flag_preprocess_only.
|
||||
* c-pragma.c (c_pp_lookup_pragma): New prototype.
|
||||
* config/darwin.h (DARWIN_REGISTER_TARGET_PRAGMAS): Don't call
|
||||
cpp_register_pragma if flag_preprocess_only.
|
||||
|
||||
2008-02-26 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||
|
||||
PR c/28800
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* C/ObjC/C++ command line option handling.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Neil Booth.
|
||||
|
||||
|
@ -1239,6 +1239,9 @@ c_common_init (void)
|
|||
if (version_flag)
|
||||
c_common_print_pch_checksum (stderr);
|
||||
|
||||
/* Has to wait until now so that cpplib has its hash table. */
|
||||
init_pragma ();
|
||||
|
||||
if (flag_preprocess_only)
|
||||
{
|
||||
finish_options ();
|
||||
|
@ -1246,9 +1249,6 @@ c_common_init (void)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Has to wait until now so that cpplib has its hash table. */
|
||||
init_pragma ();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Preprocess only, using cpplib.
|
||||
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
|
||||
Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007,
|
||||
2008 Free Software Foundation, Inc.
|
||||
Written by Per Bothner, 1994-95.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
|
@ -177,7 +177,24 @@ scan_translation_unit (cpp_reader *pfile)
|
|||
avoid_paste = false;
|
||||
print.source = NULL;
|
||||
print.prev = token;
|
||||
cpp_output_token (token, print.outf);
|
||||
if (token->type == CPP_PRAGMA)
|
||||
{
|
||||
const char *space;
|
||||
const char *name;
|
||||
|
||||
maybe_print_line (token->src_loc);
|
||||
fputs ("#pragma ", print.outf);
|
||||
c_pp_lookup_pragma (token->val.pragma, &space, &name);
|
||||
if (space)
|
||||
fprintf (print.outf, "%s %s", space, name);
|
||||
else
|
||||
fprintf (print.outf, "%s", name);
|
||||
print.printed = 1;
|
||||
}
|
||||
else if (token->type == CPP_PRAGMA_EOL)
|
||||
maybe_print_line (token->src_loc);
|
||||
else
|
||||
cpp_output_token (token, print.outf);
|
||||
|
||||
if (token->type == CPP_COMMENT)
|
||||
account_for_newlines (token->val.str.text, token->val.str.len);
|
||||
|
|
108
gcc/c-pragma.c
108
gcc/c-pragma.c
|
@ -1,6 +1,6 @@
|
|||
/* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack.
|
||||
Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
||||
2006, 2007 Free Software Foundation, Inc.
|
||||
2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -872,6 +872,61 @@ DEF_VEC_ALLOC_O (pragma_handler, heap);
|
|||
|
||||
static VEC(pragma_handler, heap) *registered_pragmas;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *space;
|
||||
const char *name;
|
||||
} pragma_ns_name;
|
||||
|
||||
DEF_VEC_O (pragma_ns_name);
|
||||
DEF_VEC_ALLOC_O (pragma_ns_name, heap);
|
||||
|
||||
static VEC(pragma_ns_name, heap) *registered_pp_pragmas;
|
||||
|
||||
struct omp_pragma_def { const char *name; unsigned int id; };
|
||||
static const struct omp_pragma_def omp_pragmas[] = {
|
||||
{ "atomic", PRAGMA_OMP_ATOMIC },
|
||||
{ "barrier", PRAGMA_OMP_BARRIER },
|
||||
{ "critical", PRAGMA_OMP_CRITICAL },
|
||||
{ "flush", PRAGMA_OMP_FLUSH },
|
||||
{ "for", PRAGMA_OMP_FOR },
|
||||
{ "master", PRAGMA_OMP_MASTER },
|
||||
{ "ordered", PRAGMA_OMP_ORDERED },
|
||||
{ "parallel", PRAGMA_OMP_PARALLEL },
|
||||
{ "section", PRAGMA_OMP_SECTION },
|
||||
{ "sections", PRAGMA_OMP_SECTIONS },
|
||||
{ "single", PRAGMA_OMP_SINGLE },
|
||||
{ "threadprivate", PRAGMA_OMP_THREADPRIVATE }
|
||||
};
|
||||
|
||||
void
|
||||
c_pp_lookup_pragma (unsigned int id, const char **space, const char **name)
|
||||
{
|
||||
const int n_omp_pragmas = sizeof (omp_pragmas) / sizeof (*omp_pragmas);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_omp_pragmas; ++i)
|
||||
if (omp_pragmas[i].id == id)
|
||||
{
|
||||
*space = "omp";
|
||||
*name = omp_pragmas[i].name;
|
||||
return;
|
||||
}
|
||||
|
||||
if (id >= PRAGMA_FIRST_EXTERNAL
|
||||
&& (id < PRAGMA_FIRST_EXTERNAL
|
||||
+ VEC_length (pragma_ns_name, registered_pp_pragmas)))
|
||||
{
|
||||
*space = VEC_index (pragma_ns_name, registered_pp_pragmas,
|
||||
id - PRAGMA_FIRST_EXTERNAL)->space;
|
||||
*name = VEC_index (pragma_ns_name, registered_pp_pragmas,
|
||||
id - PRAGMA_FIRST_EXTERNAL)->name;
|
||||
return;
|
||||
}
|
||||
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
/* Front-end wrappers for pragma registration to avoid dragging
|
||||
cpplib.h in almost everywhere. */
|
||||
|
||||
|
@ -881,13 +936,29 @@ c_register_pragma_1 (const char *space, const char *name,
|
|||
{
|
||||
unsigned id;
|
||||
|
||||
VEC_safe_push (pragma_handler, heap, registered_pragmas, &handler);
|
||||
id = VEC_length (pragma_handler, registered_pragmas);
|
||||
id += PRAGMA_FIRST_EXTERNAL - 1;
|
||||
if (flag_preprocess_only)
|
||||
{
|
||||
pragma_ns_name ns_name;
|
||||
|
||||
/* The C++ front end allocates 6 bits in cp_token; the C front end
|
||||
allocates 7 bits in c_token. At present this is sufficient. */
|
||||
gcc_assert (id < 64);
|
||||
if (!allow_expansion)
|
||||
return;
|
||||
|
||||
ns_name.space = space;
|
||||
ns_name.name = name;
|
||||
VEC_safe_push (pragma_ns_name, heap, registered_pp_pragmas, &ns_name);
|
||||
id = VEC_length (pragma_ns_name, registered_pp_pragmas);
|
||||
id += PRAGMA_FIRST_EXTERNAL - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
VEC_safe_push (pragma_handler, heap, registered_pragmas, &handler);
|
||||
id = VEC_length (pragma_handler, registered_pragmas);
|
||||
id += PRAGMA_FIRST_EXTERNAL - 1;
|
||||
|
||||
/* The C++ front end allocates 6 bits in cp_token; the C front end
|
||||
allocates 7 bits in c_token. At present this is sufficient. */
|
||||
gcc_assert (id < 64);
|
||||
}
|
||||
|
||||
cpp_register_deferred_pragma (parse_in, space, name, id,
|
||||
allow_expansion, false);
|
||||
|
@ -921,24 +992,8 @@ c_invoke_pragma_handler (unsigned int id)
|
|||
void
|
||||
init_pragma (void)
|
||||
{
|
||||
if (flag_openmp && !flag_preprocess_only)
|
||||
if (flag_openmp)
|
||||
{
|
||||
struct omp_pragma_def { const char *name; unsigned int id; };
|
||||
static const struct omp_pragma_def omp_pragmas[] = {
|
||||
{ "atomic", PRAGMA_OMP_ATOMIC },
|
||||
{ "barrier", PRAGMA_OMP_BARRIER },
|
||||
{ "critical", PRAGMA_OMP_CRITICAL },
|
||||
{ "flush", PRAGMA_OMP_FLUSH },
|
||||
{ "for", PRAGMA_OMP_FOR },
|
||||
{ "master", PRAGMA_OMP_MASTER },
|
||||
{ "ordered", PRAGMA_OMP_ORDERED },
|
||||
{ "parallel", PRAGMA_OMP_PARALLEL },
|
||||
{ "section", PRAGMA_OMP_SECTION },
|
||||
{ "sections", PRAGMA_OMP_SECTIONS },
|
||||
{ "single", PRAGMA_OMP_SINGLE },
|
||||
{ "threadprivate", PRAGMA_OMP_THREADPRIVATE }
|
||||
};
|
||||
|
||||
const int n_omp_pragmas = sizeof (omp_pragmas) / sizeof (*omp_pragmas);
|
||||
int i;
|
||||
|
||||
|
@ -947,8 +1002,9 @@ init_pragma (void)
|
|||
omp_pragmas[i].id, true, true);
|
||||
}
|
||||
|
||||
cpp_register_deferred_pragma (parse_in, "GCC", "pch_preprocess",
|
||||
PRAGMA_GCC_PCH_PREPROCESS, false, false);
|
||||
if (!flag_preprocess_only)
|
||||
cpp_register_deferred_pragma (parse_in, "GCC", "pch_preprocess",
|
||||
PRAGMA_GCC_PCH_PREPROCESS, false, false);
|
||||
|
||||
#ifdef HANDLE_PRAGMA_PACK
|
||||
#ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Pragma related interfaces.
|
||||
Copyright (C) 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
||||
2007 Free Software Foundation, Inc.
|
||||
2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -124,4 +124,6 @@ extern enum cpp_ttype pragma_lex (tree *);
|
|||
extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *,
|
||||
int);
|
||||
|
||||
extern void c_pp_lookup_pragma (unsigned int, const char **, const char **);
|
||||
|
||||
#endif /* GCC_C_PRAGMA_H */
|
||||
|
|
|
@ -892,8 +892,9 @@ enum machopic_addr_class {
|
|||
|
||||
#define DARWIN_REGISTER_TARGET_PRAGMAS() \
|
||||
do { \
|
||||
cpp_register_pragma (parse_in, NULL, "mark", \
|
||||
darwin_pragma_ignore, false); \
|
||||
if (!flag_preprocess_only) \
|
||||
cpp_register_pragma (parse_in, NULL, "mark", \
|
||||
darwin_pragma_ignore, false); \
|
||||
c_register_pragma (0, "options", darwin_pragma_options); \
|
||||
c_register_pragma (0, "segment", darwin_pragma_ignore); \
|
||||
c_register_pragma (0, "unused", darwin_pragma_unused); \
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-02-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/gomp/preprocess-1.c: New test.
|
||||
|
||||
2008-02-26 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/bf-ms-attrib.c (main): Return 0.
|
||||
|
|
16
gcc/testsuite/gcc.dg/gomp/preprocess-1.c
Normal file
16
gcc/testsuite/gcc.dg/gomp/preprocess-1.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* { dg-do preprocess } */
|
||||
|
||||
void foo (void)
|
||||
{
|
||||
int i1, j1, k1;
|
||||
#define p parallel
|
||||
#define P(x) private (x##1)
|
||||
#define S(x) shared (x##1)
|
||||
#define F(x) firstprivate (x##1)
|
||||
#pragma omp p P(i) \
|
||||
S(j) \
|
||||
F(k)
|
||||
;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-file preprocess-1.i "(^|\n)#pragma omp parallel private \\(i1\\) shared \\(j1\\) firstprivate \\(k1\\)($|\n)" } } */
|
Loading…
Add table
Reference in a new issue