#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
#include "toplev.h"
#include "cpplib.h"
#include "c-pragma.h"
#include "tm_p.h"
static int c4x_parse_pragma (const char *, tree *, tree *);
#define BAD(gmsgid, arg) do { warning (gmsgid, arg); return -1; } while (0)
static int
c4x_parse_pragma (name, func, sect)
const char *name;
tree *func;
tree *sect;
{
tree f, s, x;
if (c_lex (&x) != CPP_OPEN_PAREN)
BAD ("missing '(' after '#pragma %s' - ignored", name);
if (c_lex (&f) != CPP_NAME)
BAD ("missing function name in '#pragma %s' - ignored", name);
if (sect)
{
if (c_lex (&x) != CPP_COMMA)
BAD ("malformed '#pragma %s' - ignored", name);
if (c_lex (&s) != CPP_STRING)
BAD ("missing section name in '#pragma %s' - ignored", name);
*sect = s;
}
if (c_lex (&x) != CPP_CLOSE_PAREN)
BAD ("missing ')' for '#pragma %s' - ignored", name);
if (c_lex (&x) != CPP_EOF)
warning ("junk at end of '#pragma %s'", name);
*func = f;
return 0;
}
void
c4x_pr_CODE_SECTION (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
tree func, sect;
if (c4x_parse_pragma ("CODE_SECTION", &func, §))
return;
code_tree = chainon (code_tree,
build_tree_list (func,
build_tree_list (NULL_TREE, sect)));
}
void
c4x_pr_DATA_SECTION (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
tree func, sect;
if (c4x_parse_pragma ("DATA_SECTION", &func, §))
return;
data_tree = chainon (data_tree,
build_tree_list (func,
build_tree_list (NULL_TREE, sect)));
}
void
c4x_pr_FUNC_IS_PURE (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
tree func;
if (c4x_parse_pragma ("FUNC_IS_PURE", &func, 0))
return;
pure_tree = chainon (pure_tree, build_tree_list (func, NULL_TREE));
}
void
c4x_pr_FUNC_NEVER_RETURNS (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
tree func;
if (c4x_parse_pragma ("FUNC_NEVER_RETURNS", &func, 0))
return;
noreturn_tree = chainon (noreturn_tree, build_tree_list (func, NULL_TREE));
}
void
c4x_pr_INTERRUPT (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
tree func;
if (c4x_parse_pragma ("INTERRUPT", &func, 0))
return;
interrupt_tree = chainon (interrupt_tree, build_tree_list (func, NULL_TREE));
}
void
c4x_pr_ignored (pfile)
cpp_reader *pfile ATTRIBUTE_UNUSED;
{
}