bug#40737: Segfault in arm gcc7, thumb2 builroot, with arm patch

Ludovic Courtès <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>
Hi Andrew,

Andrew Gierth <[email protected]> skribis:

> diff --git a/libguile/lightening/lightening/arm-cpu.c b/libguile/lightening/lightening/arm-cpu.c
> index 4445266af..2b4eecc29 100644
> --- a/libguile/lightening/lightening/arm-cpu.c
> +++ b/libguile/lightening/lightening/arm-cpu.c
> @@ -230,7 +230,7 @@ encode_thumb_immediate(unsigned int v)
>      return ((v & 0xff) | (1 << 12));
>    /* abcdefgh 00000000 abcdefgh 00000000 */
>    if (((v & 0xffff0000) >> 16) == (v & 0xffff) && (v & 0xff) == 0)
> -    return ((v & 0x000000ff) | (2 << 12));
> +    return (((v & 0x0000ff00) >> 8) | (2 << 12));
>    /* abcdefgh abcdefgh abcdefgh abcdefgh */
>    if ( (v &    0xff)        == ((v &     0xff00) >>  8) &&
>         ((v &   0xff00) >> 8) == ((v &   0xff0000) >> 16) &&

I pushed this fix to the lightening repo on your behalf:

  https://gitlab.com/wingo/lightening/-/commit/1bb909a44d2303f88bb05125fc6742e97f80cd1d

The CI jobs pass:

  https://gitlab.com/wingo/lightening/-/pipelines/158337465

I’ll try merging it into Guile, but do you have a test that reproduces
the original bug, either at the Guile level or in C using the lightening
API?  Perhaps the test that Dale posted yesterday at
<https://paste.debian.net/1152897/>?

--8<---------------cut here---------------start------------->8---
#include "test.h"                                               
                                                                
static void                                                     
run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
{                                                               
  jit_begin(j, arena_base, arena_size);                         
                                                                
  jit_movi(j, JIT_R0, 0xa500a500);                              
  jit_retr(j, JIT_R0);                                          
                                                                
  jit_uword_t (*f)(void) = jit_end(j, NULL);                    
                                                                
  ASSERT(f() == 0xa500a500);                                    
}                                                               
                                                                
int                                                             
main (int argc, char *argv[])                                   
{                                                               
  return main_helper(argc, argv, run_test);                     
}                                                               
--8<---------------cut here---------------end--------------->8---

Thanks,
Ludo’.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.