Re: How to force gcc to blackhole registers so that things maybe garbage collected?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2019-05-13 16:58 +0000, Hamad Ahmed wrote:
> I am writing a C program and using the Boehm-GC for garbage collection. The GC
> collects anything whose reference doesn't exist anymore. The problem is that
> gcc will sometimes leave pointers to memory in the registers even though those
> variables won't be used anymore in the program. This is a highly variable
> behavior depending on register pressure and program size. But this messes with
> the GC if a register holds a pointer to memory then that memory never gets
> freed. We have tried putting x=NULL to force the register to be emptied but
> gcc just ignores this because x is not used anymore in the program. Is there a
> way that gcc blackholes registers if the variable they contain won't be used
> in the program anymore? Without this functionality, using a garbage collector
> is a nightmare.

*(void* volatile*)&p = NULL;

Though this looks stupid but it works:

$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <gc.h>

int main()
{
	char *p = (char *)GC_malloc(256);
	scanf("%255s", p);
	printf("%s", p);
	p = NULL;
	*(void* volatile*)&p = NULL;
	return 0;
}
$ gcc test.c -S -O3 -fverbose-asm -o - | grep volatile
# -fstrict-volatile-bitfields -fsync-libcalls -fthread-jumps
# test.c:11: 	*(void* volatile*)&p = NULL;
	movq	$0, 8(%rsp)	#, MEM[(void * volatile *)&p]

Oh, but if we know where we can put a "p = NULL" or the stupid thing I wrote,
why not use a smart pointer based on refcount instead of GC?
-- 
Xi Ruoyao <xry111@xxxxxxxxxxxxxxxx>
School of Aerospace Science and Technology, Xidian University




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux