summaryrefslogtreecommitdiff
path: root/mjit.c
diff options
context:
space:
mode:
Diffstat (limited to 'mjit.c')
-rw-r--r--mjit.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/mjit.c b/mjit.c
index 3d5b74b849..3a5d8fb142 100644
--- a/mjit.c
+++ b/mjit.c
@@ -741,34 +741,18 @@ make_pch(void)
#define append_str(p, str) append_str2(p, str, sizeof(str)-1)
#define append_lit(p, str) append_str2(p, str, rb_strlen_lit(str))
-/* Compile C file to so. It returns 1 if it succeeds. */
+#ifdef _MSC_VER
+
+/* Compile C file to so. It returns 1 if it succeeds. (mswin) */
static int
compile_c_to_so(const char *c_file, const char *so_file)
{
int exit_code;
- const char *files[] = {
-#ifndef _MSC_VER
- "-o",
-#endif
- NULL, NULL,
-#ifdef __clang__
- "-include-pch", NULL,
-#endif
-#ifdef _WIN32
-# ifdef _MSC_VER
- "-link",
-# endif
- libruby_pathflag,
-#endif
- NULL,
- };
+ const char *files[] = { NULL, NULL, "-link", libruby_pathflag, NULL };
char **args;
-#ifdef _MSC_VER
char *p;
int solen;
-#endif
-#ifdef _MSC_VER
solen = strlen(so_file);
files[0] = p = (char *)malloc(sizeof(char) * (rb_strlen_lit("-Fe") + solen + 1));
if (p == NULL)
@@ -777,13 +761,44 @@ compile_c_to_so(const char *c_file, const char *so_file)
p = append_str2(p, so_file, solen);
*p = '\0';
files[1] = c_file;
+ args = form_args(5, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS,
+ files, CC_LIBS, CC_DLDFLAGS_ARGS);
+ if (args == NULL)
+ return FALSE;
+
+ exit_code = exec_process(cc_path, args);
+ free(args);
+ free((char *)files[0]);
+
+ if (exit_code != 0)
+ verbose(2, "compile_c_to_so: compile error: %d", exit_code);
+ return exit_code == 0;
+}
+
#else
+
+/* Compile C file to so. It returns 1 if it succeeds. (non-mswin) */
+static int
+compile_c_to_so(const char *c_file, const char *so_file)
+{
+ int exit_code;
+ const char *files[] = {
+ "-o", NULL, NULL,
+# ifdef __clang__
+ "-include-pch", NULL,
+# endif
+# ifdef _WIN32
+ libruby_pathflag,
+# endif
+ NULL,
+ };
+ char **args;
+
# ifdef __clang__
files[4] = pch_file;
# endif
files[2] = c_file;
files[1] = so_file;
-#endif
args = form_args(5, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS,
files, CC_LIBS, CC_DLDFLAGS_ARGS);
if (args == NULL)
@@ -791,15 +806,14 @@ compile_c_to_so(const char *c_file, const char *so_file)
exit_code = exec_process(cc_path, args);
free(args);
-#ifdef _MSC_VER
- free((char *)files[0]);
-#endif
if (exit_code != 0)
verbose(2, "compile_c_to_so: compile error: %d", exit_code);
return exit_code == 0;
}
+#endif
+
static void *
load_func_from_so(const char *so_file, const char *funcname, struct rb_mjit_unit *unit)
{