aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/mc-boot/GmcComp.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/mc-boot/GmcComp.c')
-rw-r--r--gcc/m2/mc-boot/GmcComp.c660
1 files changed, 660 insertions, 0 deletions
diff --git a/gcc/m2/mc-boot/GmcComp.c b/gcc/m2/mc-boot/GmcComp.c
new file mode 100644
index 0000000..246b75a
--- /dev/null
+++ b/gcc/m2/mc-boot/GmcComp.c
@@ -0,0 +1,660 @@
+/* do not edit automatically generated by mc from mcComp. */
+/* Copyright (C) 2015-2022 Free Software Foundation, Inc.
+ This file is part of GNU Modula-2.
+
+GNU Modula-2 is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with gm2; see the file COPYING. If not, write to the Free Software
+Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include "config.h"
+#include "system.h"
+# if !defined (PROC_D)
+# define PROC_D
+ typedef void (*PROC_t) (void);
+ typedef struct { PROC_t proc; } PROC;
+# endif
+
+# if !defined (TRUE)
+# define TRUE (1==1)
+# endif
+
+# if !defined (FALSE)
+# define FALSE (1==0)
+# endif
+
+# include "Gmcrts.h"
+#if defined(__cplusplus)
+# undef NULL
+# define NULL 0
+#endif
+#define _mcComp_H
+#define _mcComp_C
+
+# include "GFIO.h"
+# include "Glibc.h"
+# include "Gdecl.h"
+# include "GsymbolKey.h"
+# include "GSYSTEM.h"
+# include "GmcReserved.h"
+# include "GmcSearch.h"
+# include "GmcLexBuf.h"
+# include "GmcFileName.h"
+# include "GmcPreprocess.h"
+# include "GFormatStrings.h"
+# include "Gmcflex.h"
+# include "Gmcp1.h"
+# include "Gmcp2.h"
+# include "Gmcp3.h"
+# include "Gmcp4.h"
+# include "Gmcp5.h"
+# include "GmcComment.h"
+# include "GmcError.h"
+# include "GnameKey.h"
+# include "GmcPrintf.h"
+# include "GmcQuiet.h"
+# include "GDynamicStrings.h"
+# include "GmcOptions.h"
+
+# define Debugging FALSE
+typedef struct mcComp_parserFunction_p mcComp_parserFunction;
+
+typedef struct mcComp_openFunction_p mcComp_openFunction;
+
+typedef unsigned int (*mcComp_parserFunction_t) (void);
+struct mcComp_parserFunction_p { mcComp_parserFunction_t proc; };
+
+typedef unsigned int (*mcComp_openFunction_t) (decl_node, unsigned int);
+struct mcComp_openFunction_p { mcComp_openFunction_t proc; };
+
+static unsigned int currentPass;
+
+/*
+ compile - check, s, is non NIL before calling doCompile.
+*/
+
+extern "C" void mcComp_compile (DynamicStrings_String s);
+
+/*
+ getPassNo - return the pass no.
+*/
+
+extern "C" unsigned int mcComp_getPassNo (void);
+
+/*
+ doCompile - translate file, s, using a 6 pass technique.
+*/
+
+static void doCompile (DynamicStrings_String s);
+
+/*
+ examineCompilationUnit - opens the source file to obtain the module name and kind of module.
+*/
+
+static decl_node examineCompilationUnit (void);
+
+/*
+ peepInto - peeps into source, s, and initializes a definition/implementation or
+ program module accordingly.
+*/
+
+static decl_node peepInto (DynamicStrings_String s);
+
+/*
+ initParser - returns the node of the module found in the source file.
+*/
+
+static decl_node initParser (DynamicStrings_String s);
+
+/*
+ p1 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p1 (decl_node n);
+
+/*
+ p2 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p2 (decl_node n);
+
+/*
+ p3 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p3 (decl_node n);
+
+/*
+ p4 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p4 (decl_node n);
+
+/*
+ p5 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p5 (decl_node n);
+
+/*
+ doOpen -
+*/
+
+static unsigned int doOpen (decl_node n, DynamicStrings_String symName, DynamicStrings_String fileName, unsigned int exitOnFailure);
+
+/*
+ openDef - try and open the definition module source file.
+ Returns true/false if successful/unsuccessful or
+ exitOnFailure.
+*/
+
+static unsigned int openDef (decl_node n, unsigned int exitOnFailure);
+
+/*
+ openMod - try and open the implementation/program module source file.
+ Returns true/false if successful/unsuccessful or
+ exitOnFailure.
+*/
+
+static unsigned int openMod (decl_node n, unsigned int exitOnFailure);
+
+/*
+ pass -
+*/
+
+static void pass (unsigned int no, decl_node n, mcComp_parserFunction f, decl_isNodeF isnode, mcComp_openFunction open);
+
+/*
+ doPass -
+*/
+
+static void doPass (unsigned int parseDefs, unsigned int parseMain, unsigned int no, symbolKey_performOperation p, const char *desc_, unsigned int _desc_high);
+
+/*
+ setToPassNo -
+*/
+
+static void setToPassNo (unsigned int n);
+
+/*
+ init - initialise data structures for this module.
+*/
+
+static void init (void);
+
+
+/*
+ doCompile - translate file, s, using a 6 pass technique.
+*/
+
+static void doCompile (DynamicStrings_String s)
+{
+ decl_node n;
+
+ n = initParser (s);
+ doPass (TRUE, TRUE, 1, (symbolKey_performOperation) {(symbolKey_performOperation_t) p1}, (const char *) "lexical analysis, modules, root decls and C preprocessor", 56);
+ doPass (TRUE, TRUE, 2, (symbolKey_performOperation) {(symbolKey_performOperation_t) p2}, (const char *) "[all modules] type equivalence and enumeration types", 52);
+ doPass (TRUE, TRUE, 3, (symbolKey_performOperation) {(symbolKey_performOperation_t) p3}, (const char *) "[all modules] import lists, types, variables and procedure declarations", 71);
+ doPass (TRUE, TRUE, 4, (symbolKey_performOperation) {(symbolKey_performOperation_t) p4}, (const char *) "[all modules] constant expressions", 34);
+ if (! (decl_isDef (n)))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ if (decl_isImp (n))
+ {
+ mcQuiet_qprintf0 ((const char *) "Parse implementation module\\n", 29);
+ doPass (FALSE, TRUE, 5, (symbolKey_performOperation) {(symbolKey_performOperation_t) p5}, (const char *) "[implementation module] build code tree for all procedures and module initializations", 85);
+ }
+ else
+ {
+ mcQuiet_qprintf0 ((const char *) "Parse program module\\n", 22);
+ doPass (FALSE, TRUE, 5, (symbolKey_performOperation) {(symbolKey_performOperation_t) p5}, (const char *) "[program module] build code tree for all procedures and module initializations", 78);
+ }
+ }
+ mcQuiet_qprintf0 ((const char *) "walk tree converting it to C/C++\\n", 34);
+ decl_out ();
+}
+
+
+/*
+ examineCompilationUnit - opens the source file to obtain the module name and kind of module.
+*/
+
+static decl_node examineCompilationUnit (void)
+{
+ /* stop if we see eof, ';' or '[' */
+ while (((mcLexBuf_currenttoken != mcReserved_eoftok) && (mcLexBuf_currenttoken != mcReserved_semicolontok)) && (mcLexBuf_currenttoken != mcReserved_lsbratok))
+ {
+ if (mcLexBuf_currenttoken == mcReserved_definitiontok)
+ {
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_moduletok)
+ {
+ /* avoid dangling else. */
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_fortok)
+ {
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_stringtok)
+ {
+ mcLexBuf_getToken ();
+ }
+ else
+ {
+ mcflex_mcError (DynamicStrings_string (DynamicStrings_InitString ((const char *) "expecting language string after FOR keyword", 43)));
+ libc_exit (1);
+ }
+ }
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ return decl_lookupDef (nameKey_makekey (mcLexBuf_currentstring));
+ }
+ }
+ else
+ {
+ mcflex_mcError (DynamicStrings_string (DynamicStrings_InitString ((const char *) "MODULE missing after DEFINITION keyword", 39)));
+ }
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_implementationtok)
+ {
+ /* avoid dangling else. */
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_moduletok)
+ {
+ /* avoid dangling else. */
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ return decl_lookupImp (nameKey_makekey (mcLexBuf_currentstring));
+ }
+ }
+ else
+ {
+ mcflex_mcError (DynamicStrings_string (DynamicStrings_InitString ((const char *) "MODULE missing after IMPLEMENTATION keyword", 43)));
+ }
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_moduletok)
+ {
+ /* avoid dangling else. */
+ mcLexBuf_getToken ();
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ return decl_lookupModule (nameKey_makekey (mcLexBuf_currentstring));
+ }
+ }
+ mcLexBuf_getToken ();
+ }
+ mcflex_mcError (DynamicStrings_string (DynamicStrings_InitString ((const char *) "failed to find module name", 26)));
+ libc_exit (1);
+ ReturnException ("../../gcc-git-devel-modula2/gcc/m2/mc/mcComp.def", 20, 1);
+ __builtin_unreachable ();
+}
+
+
+/*
+ peepInto - peeps into source, s, and initializes a definition/implementation or
+ program module accordingly.
+*/
+
+static decl_node peepInto (DynamicStrings_String s)
+{
+ decl_node n;
+ DynamicStrings_String fileName;
+
+ fileName = mcPreprocess_preprocessModule (s);
+ if (mcLexBuf_openSource (fileName))
+ {
+ n = examineCompilationUnit ();
+ decl_setSource (n, nameKey_makekey (DynamicStrings_string (fileName)));
+ decl_setMainModule (n);
+ mcLexBuf_closeSource ();
+ mcLexBuf_reInitialize ();
+ return n;
+ }
+ else
+ {
+ mcPrintf_fprintf1 (FIO_StdErr, (const char *) "failed to open %s\\n", 19, (const unsigned char *) &s, (sizeof (s)-1));
+ libc_exit (1);
+ }
+ ReturnException ("../../gcc-git-devel-modula2/gcc/m2/mc/mcComp.def", 20, 1);
+ __builtin_unreachable ();
+}
+
+
+/*
+ initParser - returns the node of the module found in the source file.
+*/
+
+static decl_node initParser (DynamicStrings_String s)
+{
+ mcQuiet_qprintf1 ((const char *) "Compiling: %s\\n", 15, (const unsigned char *) &s, (sizeof (s)-1));
+ return peepInto (s);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ p1 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p1 (decl_node n)
+{
+ if (decl_isDef (n))
+ {
+ /* avoid dangling else. */
+ pass (1, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp1_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isDef}, (mcComp_openFunction) {(mcComp_openFunction_t) openDef});
+ if ((decl_hasHidden (n)) && (mcOptions_getExtendedOpaque ()))
+ {
+ pass (1, decl_lookupImp (decl_getSymName (n)), (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp1_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImp}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+ }
+ else
+ {
+ pass (1, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp1_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImpOrModule}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+}
+
+
+/*
+ p2 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p2 (decl_node n)
+{
+ if (decl_isDef (n))
+ {
+ /* avoid dangling else. */
+ pass (2, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp2_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isDef}, (mcComp_openFunction) {(mcComp_openFunction_t) openDef});
+ if ((decl_hasHidden (n)) && (mcOptions_getExtendedOpaque ()))
+ {
+ pass (2, decl_lookupImp (decl_getSymName (n)), (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp2_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImp}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+ }
+ else
+ {
+ pass (2, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp2_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImpOrModule}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+}
+
+
+/*
+ p3 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p3 (decl_node n)
+{
+ if (decl_isDef (n))
+ {
+ /* avoid dangling else. */
+ pass (3, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp3_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isDef}, (mcComp_openFunction) {(mcComp_openFunction_t) openDef});
+ if ((decl_hasHidden (n)) && (mcOptions_getExtendedOpaque ()))
+ {
+ pass (3, decl_lookupImp (decl_getSymName (n)), (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp3_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImp}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+ }
+ else
+ {
+ pass (3, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp3_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImpOrModule}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+}
+
+
+/*
+ p4 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p4 (decl_node n)
+{
+ if (decl_isDef (n))
+ {
+ /* avoid dangling else. */
+ pass (4, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp4_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isDef}, (mcComp_openFunction) {(mcComp_openFunction_t) openDef});
+ if ((decl_hasHidden (n)) && (mcOptions_getExtendedOpaque ()))
+ {
+ pass (4, decl_lookupImp (decl_getSymName (n)), (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp4_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImp}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+ }
+ else
+ {
+ pass (4, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp4_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImpOrModule}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+ }
+}
+
+
+/*
+ p5 - wrap the pass procedure with the correct parameter values.
+*/
+
+static void p5 (decl_node n)
+{
+ pass (5, n, (mcComp_parserFunction) {(mcComp_parserFunction_t) mcp5_CompilationUnit}, (decl_isNodeF) {(decl_isNodeF_t) decl_isImpOrModule}, (mcComp_openFunction) {(mcComp_openFunction_t) openMod});
+}
+
+
+/*
+ doOpen -
+*/
+
+static unsigned int doOpen (decl_node n, DynamicStrings_String symName, DynamicStrings_String fileName, unsigned int exitOnFailure)
+{
+ DynamicStrings_String postProcessed;
+
+ mcQuiet_qprintf2 ((const char *) " Module %-20s : %s\\n", 22, (const unsigned char *) &symName, (sizeof (symName)-1), (const unsigned char *) &fileName, (sizeof (fileName)-1));
+ postProcessed = mcPreprocess_preprocessModule (fileName);
+ decl_setSource (n, nameKey_makekey (DynamicStrings_string (postProcessed)));
+ decl_setCurrentModule (n);
+ if (mcLexBuf_openSource (postProcessed))
+ {
+ return TRUE;
+ }
+ mcPrintf_fprintf1 (FIO_StdErr, (const char *) "failed to open %s\\n", 19, (const unsigned char *) &fileName, (sizeof (fileName)-1));
+ if (exitOnFailure)
+ {
+ libc_exit (1);
+ }
+ return FALSE;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ openDef - try and open the definition module source file.
+ Returns true/false if successful/unsuccessful or
+ exitOnFailure.
+*/
+
+static unsigned int openDef (decl_node n, unsigned int exitOnFailure)
+{
+ nameKey_Name sourceName;
+ DynamicStrings_String symName;
+ DynamicStrings_String fileName;
+
+ sourceName = decl_getSource (n);
+ symName = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (decl_getSymName (n)));
+ if (sourceName == nameKey_NulName)
+ {
+ /* avoid dangling else. */
+ if (! (mcSearch_findSourceDefFile (symName, &fileName)))
+ {
+ mcPrintf_fprintf1 (FIO_StdErr, (const char *) "failed to find definition module %s.def\\n", 41, (const unsigned char *) &symName, (sizeof (symName)-1));
+ if (exitOnFailure)
+ {
+ libc_exit (1);
+ }
+ }
+ }
+ else
+ {
+ fileName = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (sourceName));
+ }
+ return doOpen (n, symName, fileName, exitOnFailure);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ openMod - try and open the implementation/program module source file.
+ Returns true/false if successful/unsuccessful or
+ exitOnFailure.
+*/
+
+static unsigned int openMod (decl_node n, unsigned int exitOnFailure)
+{
+ nameKey_Name sourceName;
+ DynamicStrings_String symName;
+ DynamicStrings_String fileName;
+
+ sourceName = decl_getSource (n);
+ symName = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (decl_getSymName (n)));
+ if (sourceName == nameKey_NulName)
+ {
+ /* avoid dangling else. */
+ if (! (mcSearch_findSourceModFile (symName, &fileName)))
+ {
+ if (decl_isImp (n))
+ {
+ mcPrintf_fprintf1 (FIO_StdErr, (const char *) "failed to find implementation module %s.mod\\n", 45, (const unsigned char *) &symName, (sizeof (symName)-1));
+ }
+ else
+ {
+ mcPrintf_fprintf1 (FIO_StdErr, (const char *) "failed to find program module %s.mod\\n", 38, (const unsigned char *) &symName, (sizeof (symName)-1));
+ }
+ if (exitOnFailure)
+ {
+ libc_exit (1);
+ }
+ }
+ }
+ else
+ {
+ fileName = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (sourceName));
+ }
+ return doOpen (n, symName, fileName, exitOnFailure);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ pass -
+*/
+
+static void pass (unsigned int no, decl_node n, mcComp_parserFunction f, decl_isNodeF isnode, mcComp_openFunction open)
+{
+ if (((*isnode.proc) (n)) && (! (decl_isVisited (n))))
+ {
+ decl_setVisited (n);
+ if ((*open.proc) (n, TRUE))
+ {
+ if (! ((*f.proc) ()))
+ {
+ mcError_writeFormat0 ((const char *) "compilation failed", 18);
+ mcLexBuf_closeSource ();
+ return ;
+ }
+ mcLexBuf_closeSource ();
+ }
+ }
+}
+
+
+/*
+ doPass -
+*/
+
+static void doPass (unsigned int parseDefs, unsigned int parseMain, unsigned int no, symbolKey_performOperation p, const char *desc_, unsigned int _desc_high)
+{
+ DynamicStrings_String descs;
+ char desc[_desc_high+1];
+
+ /* make a local copy of each unbounded array. */
+ memcpy (desc, desc_, _desc_high+1);
+
+ setToPassNo (no);
+ descs = DynamicStrings_InitString ((const char *) desc, _desc_high);
+ mcQuiet_qprintf2 ((const char *) "Pass %d: %s\\n", 13, (const unsigned char *) &no, (sizeof (no)-1), (const unsigned char *) &descs, (sizeof (descs)-1));
+ decl_foreachDefModuleDo ((symbolKey_performOperation) {(symbolKey_performOperation_t) decl_unsetVisited});
+ decl_foreachModModuleDo ((symbolKey_performOperation) {(symbolKey_performOperation_t) decl_unsetVisited});
+ if (parseMain)
+ {
+ decl_unsetVisited (decl_getMainModule ());
+ if (parseDefs && (decl_isImp (decl_getMainModule ())))
+ {
+ /* we need to parse the definition module of a corresponding implementation module. */
+ (*p.proc) (reinterpret_cast<void *> (decl_lookupDef (decl_getSymName (decl_getMainModule ()))));
+ }
+ (*p.proc) (reinterpret_cast<void *> (decl_getMainModule ()));
+ }
+ if (parseDefs)
+ {
+ decl_foreachDefModuleDo (p);
+ }
+ mcError_flushWarnings ();
+ mcError_flushErrors ();
+ setToPassNo (0);
+}
+
+
+/*
+ setToPassNo -
+*/
+
+static void setToPassNo (unsigned int n)
+{
+ currentPass = n;
+}
+
+
+/*
+ init - initialise data structures for this module.
+*/
+
+static void init (void)
+{
+ setToPassNo (0);
+}
+
+
+/*
+ compile - check, s, is non NIL before calling doCompile.
+*/
+
+extern "C" void mcComp_compile (DynamicStrings_String s)
+{
+ if (s != NULL)
+ {
+ doCompile (s);
+ }
+}
+
+
+/*
+ getPassNo - return the pass no.
+*/
+
+extern "C" unsigned int mcComp_getPassNo (void)
+{
+ return currentPass;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+extern "C" void _M2_mcComp_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+ init ();
+}
+
+extern "C" void _M2_mcComp_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+}