diff options
author | Antoni Boucher <bouanto@zoho.com> | 2021-12-12 16:16:21 -0500 |
---|---|---|
committer | Antoni Boucher <bouanto@zoho.com> | 2021-12-12 16:16:23 -0500 |
commit | 0b52083ea2c2dd9897031fdc3802a68fd4aa45ef (patch) | |
tree | 38c90893498f6f89ee9616f5bbb567240bfc1311 /gcc/testsuite/jit.dg | |
parent | aeedb00a1ae2ccd10b1a5f00ff466081aeadb54b (diff) | |
download | gcc-0b52083ea2c2dd9897031fdc3802a68fd4aa45ef.zip gcc-0b52083ea2c2dd9897031fdc3802a68fd4aa45ef.tar.gz gcc-0b52083ea2c2dd9897031fdc3802a68fd4aa45ef.tar.bz2 |
libgccjit: Add support for setting the link section of global variables [PR100688]
2021-12-12 Antoni Boucher <bouanto@zoho.com>
gcc/jit/
PR target/100688
* docs/topics/compatibility.rst (LIBGCCJIT_ABI_18): New ABI
tag.
* docs/topics/expressions.rst: Add documentation for the
function gcc_jit_lvalue_set_link_section.
* jit-playback.h: New function (set_link_section).
* jit-recording.c: New function (set_link_section) and
support for setting the link section.
* jit-recording.h: New function (set_link_section) and new
field m_link_section.
* libgccjit.c: New function (gcc_jit_lvalue_set_link_section).
* libgccjit.h: New function (gcc_jit_lvalue_set_link_section).
* libgccjit.map (LIBGCCJIT_ABI_18): New ABI tag.
gcc/testsuite/
PR target/100688
* jit.dg/all-non-failing-tests.h: Mention new test
link-section-assembler.
* jit.dg/test-link-section-assembler.c: New test.
* jit.dg/jit.exp: New helper function to test that the
assembly contains a pattern.
Diffstat (limited to 'gcc/testsuite/jit.dg')
-rw-r--r-- | gcc/testsuite/jit.dg/all-non-failing-tests.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/jit.dg/jit.exp | 33 | ||||
-rw-r--r-- | gcc/testsuite/jit.dg/test-link-section-assembler.c | 37 |
3 files changed, 73 insertions, 0 deletions
diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h index 350a30b..3e8ccbc 100644 --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h @@ -209,6 +209,9 @@ #undef create_code #undef verify_code +/* test-link-section-assembler.c: This can't be in the testcases array as it + doesn't have a verify_code implementation. */ + /* test-linked-list.c */ #define create_code create_code_linked_list #define verify_code verify_code_linked_list diff --git a/gcc/testsuite/jit.dg/jit.exp b/gcc/testsuite/jit.dg/jit.exp index 10b98bd..3568dbb 100644 --- a/gcc/testsuite/jit.dg/jit.exp +++ b/gcc/testsuite/jit.dg/jit.exp @@ -864,6 +864,39 @@ proc jit-verify-assembler { args } { jit-run-executable ${executable_from_asm} ${dg-output-text} } +# Assuming that a .s file has been written out named +# OUTPUT_FILENAME, check that the argument matches the +# output file. +# For use by the test-link-section-assembler.c testcase. +proc jit-verify-assembler-output { args } { + verbose "jit-verify-assembler: $args" + + set dg-output-text [lindex $args 0] + verbose "dg-output-text: ${dg-output-text}" + + upvar 2 name name + verbose "name: $name" + + upvar 2 prog prog + verbose "prog: $prog" + set asm_filename [jit-get-output-filename $prog] + verbose " asm_filename: ${asm_filename}" + + # Read the assembly file. + set f [open $asm_filename r] + set content [read $f] + close $f + + # Verify that the assembly matches the regex. + if { ![regexp ${dg-output-text} $content] } { + fail "${asm_filename} output pattern test, is ${content}, should match ${dg-output-text}" + verbose "Failed test for output pattern ${dg-output-text}" 3 + } else { + pass "${asm_filename} output pattern test, ${dg-output-text}" + verbose "Passed test for output pattern ${dg-output-text}" 3 + } + +} # Assuming that a .o file has been written out named # OUTPUT_FILENAME, invoke the driver to try to turn it into # an executable, and try to run the result. diff --git a/gcc/testsuite/jit.dg/test-link-section-assembler.c b/gcc/testsuite/jit.dg/test-link-section-assembler.c new file mode 100644 index 0000000..a90b00e --- /dev/null +++ b/gcc/testsuite/jit.dg/test-link-section-assembler.c @@ -0,0 +1,37 @@ +#include <stdlib.h> +#include <stdio.h> + +#include "libgccjit.h" + +#define TEST_COMPILING_TO_FILE +#define OUTPUT_KIND GCC_JIT_OUTPUT_KIND_ASSEMBLER +#define OUTPUT_FILENAME "output-of-test-link-section-assembler.c.s" +#include "harness.h" + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Let's try to inject the equivalent of: + int foo __attribute__((section(".section"))); + */ + gcc_jit_type *int_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); + gcc_jit_lvalue *foo = + gcc_jit_context_new_global ( + ctxt, NULL, GCC_JIT_GLOBAL_EXPORTED, int_type, "foo"); + gcc_jit_lvalue_set_link_section(foo, ".my_section"); + + gcc_jit_function *func_main = + gcc_jit_context_new_function (ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + int_type, + "main", + 0, NULL, + 0); + gcc_jit_rvalue *zero = gcc_jit_context_zero (ctxt, int_type); + gcc_jit_block *block = gcc_jit_function_new_block (func_main, NULL); + gcc_jit_block_end_with_return (block, NULL, zero); +} + +/* { dg-final { jit-verify-output-file-was-created "" } } */ +/* { dg-final { jit-verify-assembler-output ".section .my_section" } } */ |