(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
plugin/
pragma_plugin.c
       1  /* Demonstrates how to add custom pragmas */
       2  
       3  #include "gcc-plugin.h"
       4  #include <stdlib.h>
       5  #include "config.h"
       6  #include "system.h"
       7  #include "coretypes.h"
       8  #include "tm.h"
       9  #include "rtl.h"
      10  #include "tree.h"
      11  #include "function.h"
      12  #include "c-family/c-pragma.h"
      13  #include "cpplib.h"
      14  #include "tree-pass.h"
      15  #include "intl.h"
      16  #include "toplev.h"
      17  #include "diagnostic.h"
      18  
      19  int plugin_is_GPL_compatible;
      20  
      21  
      22  /* handler of #pragma GCCPLUGIN sayhello "message" is quite similar to
      23     handler of #pragma GCC message...*/
      24  
      25  static void
      26  handle_pragma_sayhello (cpp_reader *dummy)
      27  {
      28    tree message = 0;
      29    if (pragma_lex (&message) != CPP_STRING)
      30      {
      31        warning (OPT_Wpragmas, "%<#pragma GCCPLUGIN sayhello%>  is not a string");
      32        return;
      33      }
      34    if (TREE_STRING_LENGTH (message) > 1)
      35      {
      36        location_t loc = expansion_point_location (input_location);
      37        if (cfun)
      38  	warning_at (loc, OPT_Wpragmas, 
      39  		    "%<pragma GCCPLUGIN sayhello%> from function %qE: %s",
      40  		    cfun->decl, TREE_STRING_POINTER (message));
      41        else
      42  	warning_at (loc, OPT_Wpragmas, 
      43  		    "%<pragma GCCPLUGIN sayhello%> outside of function: %s",
      44  		    TREE_STRING_POINTER (message));
      45      }
      46  }
      47  
      48  /* Plugin callback called during pragma registration */
      49  
      50  static void 
      51  register_my_pragma (void *event_data, void *data) 
      52  {
      53    warning (0, G_("Callback to register pragmas"));
      54    c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
      55  }
      56  
      57  int
      58  plugin_init (struct plugin_name_args *plugin_info,
      59               struct plugin_gcc_version *version)
      60  {
      61    const char *plugin_name = plugin_info->base_name;
      62  
      63    register_callback (plugin_name, PLUGIN_PRAGMAS, register_my_pragma, NULL);
      64    return 0;
      65  }