summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/_scm.h3
-rw-r--r--libguile/objcodes.c30
2 files changed, 32 insertions, 1 deletions
diff --git a/libguile/_scm.h b/libguile/_scm.h
index 284213032..48fb2ccb6 100644
--- a/libguile/_scm.h
+++ b/libguile/_scm.h
@@ -219,6 +219,9 @@
/* The objcode magic header. */
#define SCM_OBJCODE_COOKIE \
"GOOF----" SCM_OBJCODE_MACHINE_VERSION_STRING
+#define SCM_OBJCODE_ENDIANNESS_OFFSET 8
+#define SCM_OBJCODE_WORD_SIZE_OFFSET 11
+
#endif /* SCM__SCM_H */
diff --git a/libguile/objcodes.c b/libguile/objcodes.c
index 448badafb..c45ca8585 100644
--- a/libguile/objcodes.c
+++ b/libguile/objcodes.c
@@ -327,10 +327,38 @@ SCM_DEFINE (scm_write_objcode, "write-objcode", 2, 0, 0,
"")
#define FUNC_NAME s_scm_write_objcode
{
+ static SCM target_endianness_var = SCM_BOOL_F;
+ static SCM target_word_size_var = SCM_BOOL_F;
+
+ char cookie[sizeof (SCM_OBJCODE_COOKIE) - 1];
+ char endianness;
+ char word_size;
+
SCM_VALIDATE_OBJCODE (1, objcode);
SCM_VALIDATE_OUTPUT_PORT (2, port);
- scm_c_write (port, SCM_OBJCODE_COOKIE, strlen (SCM_OBJCODE_COOKIE));
+ if (scm_is_false (target_endianness_var))
+ target_endianness_var =
+ scm_c_public_variable ("system base target", "target-endianness");
+ if (scm_is_false (target_word_size_var))
+ target_word_size_var =
+ scm_c_public_variable ("system base target", "target-word-size");
+
+ endianness =
+ scm_is_eq (scm_call_0 (scm_variable_ref (target_endianness_var)),
+ scm_endianness_big) ? 'B' : 'L';
+ switch (scm_to_int (scm_call_0 (scm_variable_ref (target_word_size_var))))
+ {
+ case 4: word_size = '4'; break;
+ case 8: word_size = '8'; break;
+ default: abort ();
+ }
+
+ memcpy (cookie, SCM_OBJCODE_COOKIE, strlen (SCM_OBJCODE_COOKIE));
+ cookie[SCM_OBJCODE_ENDIANNESS_OFFSET] = endianness;
+ cookie[SCM_OBJCODE_WORD_SIZE_OFFSET] = word_size;
+
+ scm_c_write (port, cookie, strlen (SCM_OBJCODE_COOKIE));
scm_c_write (port, SCM_OBJCODE_DATA (objcode),
sizeof (struct scm_objcode) + SCM_OBJCODE_TOTAL_LEN (objcode));