diff options
Diffstat (limited to 'libctf/testsuite')
-rw-r--r-- | libctf/testsuite/config/default.exp | 8 | ||||
-rw-r--r-- | libctf/testsuite/lib/ctf-lib.exp | 45 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/add-to-opened.c | 15 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/lookup.exp | 5 | ||||
-rw-r--r-- | libctf/testsuite/libctf-regression/libctf-repeat-cu.exp | 5 | ||||
-rw-r--r-- | libctf/testsuite/libctf-regression/regression.exp | 5 | ||||
-rw-r--r-- | libctf/testsuite/libctf-writable/ctf-compressed.c | 4 | ||||
-rw-r--r-- | libctf/testsuite/libctf-writable/ctf-nonroot-addition.c | 38 | ||||
-rw-r--r-- | libctf/testsuite/libctf-writable/ctf-nonroot-addition.lk | 1 | ||||
-rw-r--r-- | libctf/testsuite/libctf-writable/ctf-nonroot-linking.c | 11 |
10 files changed, 124 insertions, 13 deletions
diff --git a/libctf/testsuite/config/default.exp b/libctf/testsuite/config/default.exp index f244826..d5e51f4 100644 --- a/libctf/testsuite/config/default.exp +++ b/libctf/testsuite/config/default.exp @@ -34,6 +34,10 @@ if ![info exists as] then { set as [findfile $base_dir/../gas/as-new $base_dir/../gas/as-new [transform as]] } +if ![info exists objdump] then { + set objdump [findfile $base_dir/../binutils/objdump] +} + remote_exec host "mkdir -p tmpdir" # Make symlinks from tmpdir/libctf to the linker and assembler in the @@ -63,10 +67,12 @@ if {![info exists CFLAGS_FOR_TARGET]} { if ![info exists AR] then { set AR [findfile $base_dir/../binutils/ar] } - if {![info exists OBJDUMP]} { set OBJDUMP [findfile $base_dir/../binutils/objdump] } +if ![info exists OBJDUMPFLAGS] then { + set OBJDUMPFLAGS {} +} # load the utility procedures load_lib ctf-lib.exp diff --git a/libctf/testsuite/lib/ctf-lib.exp b/libctf/testsuite/lib/ctf-lib.exp index 64d2a40..4df6619 100644 --- a/libctf/testsuite/lib/ctf-lib.exp +++ b/libctf/testsuite/lib/ctf-lib.exp @@ -20,6 +20,51 @@ load_file $srcdir/../../ld/testsuite/lib/ld-lib.exp +# Returns true if the target linker deduplicates CTF. +proc check_ctf_linker_dedup { } { + global ctf_linker_dedup_saved + + if {![info exists ctf_linker_dedup_saved]} { + set ctf_linker_dedup_saved 0 + + if ([check_ctf_available]) { + global objdump srcdir + + set basename "tmpdir/ctf_linker_dedups[pid]" + compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-A.c ${basename}-A.o "-gctf -fPIC -c" + compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-B.c ${basename}-B.o "-gctf -fPIC -c" + compile_one_cc "${basename}-A.o ${basename}-B.o" $basename.so "-gctf -fPIC -shared" + if {! [remote_file host exists $basename.so] } { + return 0 + } + + # Don't use run_host_cmd: it dumps the entire output into the log, + # even on success. + set cmdret [remote_exec host [concat sh -c [list "$objdump --ctf $basename.so >dump.out 2>dump.err"]] "" "/dev/null"] + set cmdret [lindex $cmdret 0] + remote_upload host "dump.out" + remote_upload host "dump.err" + set dump_out [prune_warnings [file_contents "dump.out"]] + set dump_err [prune_warnings [file_contents "dump.err"]] + remote_file host delete "dump.out" "dump.err" + remote_file build delete "dump.out" "dump.err" + + if {$cmdret != 0} { + verbose -log "failed with $cmdret: stderr: $dump_err" + verbose -log "output: $dump_out" + return 0; + } + + remote_file host delete $basename.so ${basename}-A.o ${basename}-B.o + if [regexp {CTF archive member: } $dump_out] { + set ctf_linker_dedup_saved 1 + } + } + } + return $ctf_linker_dedup_saved +} + + proc run_native_host_cmd { command } { global link_output global ld diff --git a/libctf/testsuite/libctf-lookup/add-to-opened.c b/libctf/testsuite/libctf-lookup/add-to-opened.c index 96629af..700257e 100644 --- a/libctf/testsuite/libctf-lookup/add-to-opened.c +++ b/libctf/testsuite/libctf-lookup/add-to-opened.c @@ -15,7 +15,7 @@ main (int argc, char *argv[]) ctf_encoding_t en = { CTF_INT_SIGNED, 0, sizeof (int) }; unsigned char *ctf_written; size_t size; - int err; + int err = 666; if (argc != 2) { @@ -25,9 +25,18 @@ main (int argc, char *argv[]) if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) goto open_err; + + /* The error int should be reset on success as well as on error. */ + if (err != 0) + goto err_err; + + err = 666; if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) goto open_err; + if (err != 0) + goto err_err; + /* Check that various modifications to already-written types are prohibited. */ @@ -145,4 +154,8 @@ main (int argc, char *argv[]) open_err: fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); return 1; + + err_err: + fprintf (stderr, "%s: open error not set to success on success\n", argv[0]); + return 1; } diff --git a/libctf/testsuite/libctf-lookup/lookup.exp b/libctf/testsuite/libctf-lookup/lookup.exp index a8b09c2..d15c315 100644 --- a/libctf/testsuite/libctf-lookup/lookup.exp +++ b/libctf/testsuite/libctf-lookup/lookup.exp @@ -28,6 +28,11 @@ if {![check_ctf_available]} { return 0 } +if {![check_ctf_linker_dedup]} { + unsupported "no CTF deduplication support in the linker" + return 0 +} + if {[info exists env(LC_ALL)]} { set old_lc_all $env(LC_ALL) } diff --git a/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp b/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp index e29cf63..7c19fe8 100644 --- a/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp +++ b/libctf/testsuite/libctf-regression/libctf-repeat-cu.exp @@ -37,6 +37,11 @@ if {![check_ctf_available]} { return 0 } +if {![check_ctf_linker_dedup]} { + unsupported "no CTF deduplication support in the linker" + return 0 +} + if {[info exists env(LC_ALL)]} { set old_lc_all $env(LC_ALL) } diff --git a/libctf/testsuite/libctf-regression/regression.exp b/libctf/testsuite/libctf-regression/regression.exp index e4b6347..0270cca 100644 --- a/libctf/testsuite/libctf-regression/regression.exp +++ b/libctf/testsuite/libctf-regression/regression.exp @@ -23,6 +23,11 @@ if {![check_ctf_available]} { return 0 } +if {![check_ctf_linker_dedup]} { + unsupported "no CTF deduplication support in the linker" + return 0 +} + if ![is_elf_format] { unsupported "CTF needs bfd changes to be emitted on non-ELF" return 0 diff --git a/libctf/testsuite/libctf-writable/ctf-compressed.c b/libctf/testsuite/libctf-writable/ctf-compressed.c index 4769cdb..646b603 100644 --- a/libctf/testsuite/libctf-writable/ctf-compressed.c +++ b/libctf/testsuite/libctf-writable/ctf-compressed.c @@ -119,10 +119,14 @@ main (int argc, char *argv[]) /* Dump the header of each archive member, and search for CTF_F_COMPRESS in the resulting dump. */ + err = 666; while ((dump_fp = ctf_archive_next (final_arc, &i, NULL, 0, &err)) != NULL) { char *dumpstr; + if (err != 0) + fprintf (stderr, "err not set to success on success\n"); + while ((dumpstr = ctf_dump (dump_fp, &dump_state, CTF_SECT_HEADER, NULL, NULL)) != NULL) { diff --git a/libctf/testsuite/libctf-writable/ctf-nonroot-addition.c b/libctf/testsuite/libctf-writable/ctf-nonroot-addition.c new file mode 100644 index 0000000..94ce05c --- /dev/null +++ b/libctf/testsuite/libctf-writable/ctf-nonroot-addition.c @@ -0,0 +1,38 @@ +/* Make sure adding a non-root-visible type after adding a root-visible forward + adds a new type rather than promoting and returning the existing one. */ + +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int +main (int argc, char *argv[]) +{ + ctf_dict_t *fp; + ctf_id_t root, nonroot; + int err; + + if ((fp = ctf_create (&err)) == NULL) + { + fprintf (stderr, "Cannot create: %s\n", ctf_errmsg (err)); + return 1; + } + + if ((root = ctf_add_forward (fp, CTF_ADD_ROOT, "foo", CTF_K_ENUM)) == CTF_ERR) + goto add_err; + + if ((nonroot = ctf_add_enum (fp, CTF_ADD_NONROOT, "foo")) == CTF_ERR) + goto add_err; + + if (nonroot == root) + fprintf (stderr, "Non-root addition should not promote root-visible forwards\n"); + else + printf ("All done.\n"); + + ctf_dict_close (fp); + return 0; + + add_err: + fprintf (stderr, "Cannot add: %s\n", ctf_errmsg (ctf_errno (fp))); +} diff --git a/libctf/testsuite/libctf-writable/ctf-nonroot-addition.lk b/libctf/testsuite/libctf-writable/ctf-nonroot-addition.lk new file mode 100644 index 0000000..b944f73 --- /dev/null +++ b/libctf/testsuite/libctf-writable/ctf-nonroot-addition.lk @@ -0,0 +1 @@ +All done. diff --git a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c b/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c index 6edd189..67b85eb 100644 --- a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c +++ b/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c @@ -24,16 +24,6 @@ main (int argc, char *argv[]) ctf_next_t *i = NULL; int err; - /* Linking does not currently work on mingw because of an unreliable tmpfile - implementation on that platform (see - https://github.com/msys2/MINGW-packages/issues/18878). Simply skip for - now. */ - -#ifdef __MINGW32__ - printf ("UNSUPPORTED: platform bug breaks ctf_link\n"); - return 0; -#else - if ((fp = ctf_create (&err)) == NULL) goto create_err; @@ -123,5 +113,4 @@ main (int argc, char *argv[]) link_err: fprintf (stderr, "Cannot link: %s\n", ctf_errmsg (ctf_errno (fp))); return 1; -#endif } |