summaryrefslogtreecommitdiff
path: root/yjit_asm.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2021-10-01 18:38:39 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:42 -0400
commitf6da559d5b88981000d4c575b6384f59d30dec22 (patch)
tree00fab354584931dd6f88dc275c26260c17259379 /yjit_asm.c
parent25eed2848344f19385b39daaac8ca5eef79f9466 (diff)
Put YJIT into a single compilation unit
For upstreaming, we want functions we export either prefixed with "rb_" or made static. Historically we haven't been following this rule, so we were "leaking" a lot of symbols as `make leak-globals` would tell us. This change unifies everything YJIT into a single compilation unit, yjit.o, and makes everything unprefixed static to pass `make leak-globals`. This manual "unified build" setup is similar to that of vm.o. Having everything in one compilation unit allows static functions to be visible across YJIT files and removes the need for declarations in headers in some cases. Unnecessary declarations were removed. Other changes of note: - switched to MJIT_SYMBOL_EXPORT_BEGIN which indicates stuff as being off limits for native extensions - the first include of each YJIT file is change to be "internal.h" - undefined MAP_STACK before explicitly redefining it since it collide's with a definition in system headers. Consider renaming?
Diffstat (limited to 'yjit_asm.c')
-rw-r--r--yjit_asm.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/yjit_asm.c b/yjit_asm.c
index fa26ce0908..15da7a37a1 100644
--- a/yjit_asm.c
+++ b/yjit_asm.c
@@ -1,6 +1,9 @@
-// For MAP_ANONYMOUS on GNU/Linux
-#define _GNU_SOURCE
-
+// This file is a fragment of the yjit.o compilation unit. See yjit.c.
+//
+// Note that the definition for some of these functions don't specify
+// static inline, but their declaration in yjit_asm.h do. The resulting
+// linkage is the same as if they both specify. The relevant sections in
+// N1256 is 6.2.2p4, 6.2.2p5, and 6.7.4p5.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -97,7 +100,7 @@ x86opnd_t mem_opnd_sib(uint32_t num_bits, x86opnd_t base_reg, x86opnd_t index_re
return opnd;
}
-x86opnd_t resize_opnd(x86opnd_t opnd, uint32_t num_bits)
+static x86opnd_t resize_opnd(x86opnd_t opnd, uint32_t num_bits)
{
assert (num_bits % 8 == 0);
x86opnd_t sub = opnd;
@@ -220,10 +223,10 @@ uint8_t *alloc_exec_mem(uint32_t mem_size)
}
// Head of the list of free code pages
-code_page_t *freelist = NULL;
+static code_page_t *freelist = NULL;
// Allocate a single code page from a pool of free pages
-code_page_t *alloc_code_page()
+code_page_t *alloc_code_page(void)
{
// If the free list is empty
if (!freelist) {
@@ -443,7 +446,7 @@ void cb_link_labels(codeblock_t *cb)
}
// Check if an operand needs a REX byte to be encoded
-bool rex_needed(x86opnd_t opnd)
+static bool rex_needed(x86opnd_t opnd)
{
if (opnd.type == OPND_NONE || opnd.type == OPND_IMM)
{
@@ -467,7 +470,7 @@ bool rex_needed(x86opnd_t opnd)
}
// Check if an SIB byte is needed to encode this operand
-bool sib_needed(x86opnd_t opnd)
+static bool sib_needed(x86opnd_t opnd)
{
if (opnd.type != OPND_MEM)
return false;
@@ -480,7 +483,7 @@ bool sib_needed(x86opnd_t opnd)
}
// Compute the size of the displacement field needed for a memory operand
-uint32_t disp_size(x86opnd_t opnd)
+static uint32_t disp_size(x86opnd_t opnd)
{
assert (opnd.type == OPND_MEM);
@@ -546,7 +549,7 @@ static void cb_write_opcode(codeblock_t *cb, uint8_t opcode, x86opnd_t reg)
}
// Encode an RM instruction
-void cb_write_rm(
+static void cb_write_rm(
codeblock_t *cb,
bool szPref,
bool rexW,
@@ -707,7 +710,7 @@ void cb_write_rm(
}
// Encode a mul-like single-operand RM instruction
-void write_rm_unary(
+static void write_rm_unary(
codeblock_t *cb,
const char *mnem,
uint8_t opMemReg8,
@@ -736,7 +739,7 @@ void write_rm_unary(
}
// Encode an add-like RM instruction with multiple possible encodings
-void cb_write_rm_multi(
+static void cb_write_rm_multi(
codeblock_t *cb,
const char *mnem,
uint8_t opMemReg8,
@@ -835,7 +838,7 @@ void cb_write_rm_multi(
}
// Encode a single-operand shift instruction
-void cb_write_shift(
+static void cb_write_shift(
codeblock_t *cb,
const char *mnem,
uint8_t opMemOnePref,
@@ -886,7 +889,7 @@ void cb_write_shift(
// Encode a relative jump to a label (direct or conditional)
// Note: this always encodes a 32-bit offset
-void cb_write_jcc(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op1, uint32_t label_idx)
+static void cb_write_jcc(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op1, uint32_t label_idx)
{
//cb.writeASM(mnem, label);
@@ -903,7 +906,7 @@ void cb_write_jcc(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op1, u
}
// Encode a relative jump to a pointer at a 32-bit offset (direct or conditional)
-void cb_write_jcc_ptr(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op1, uint8_t *dst_ptr)
+static void cb_write_jcc_ptr(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op1, uint8_t *dst_ptr)
{
//cb.writeASM(mnem, label);
@@ -924,7 +927,7 @@ void cb_write_jcc_ptr(codeblock_t *cb, const char *mnem, uint8_t op0, uint8_t op
}
// Encode a conditional move instruction
-void cb_write_cmov(codeblock_t *cb, const char *mnem, uint8_t opcode1, x86opnd_t dst, x86opnd_t src)
+static void cb_write_cmov(codeblock_t *cb, const char *mnem, uint8_t opcode1, x86opnd_t dst, x86opnd_t src)
{
//cb.writeASM(mnem, dst, src);
@@ -977,7 +980,7 @@ void and(codeblock_t *cb, x86opnd_t opnd0, x86opnd_t opnd1)
}
// call - Call to a pointer with a 32-bit displacement offset
-void call_rel32(codeblock_t *cb, int32_t rel32)
+static void call_rel32(codeblock_t *cb, int32_t rel32)
{
//cb.writeASM("call", rel32);