Emit a variable defined in gcc
Hello, I am working on a gcc patch for asan. The patch is almost ready except one thing. To make sure that the user has applied this patch before using asan feature, I want to declare an additional variable in gcc which is reference by our source code so that if this patch is missing, the user gets an error compiling the code because the reference to this variable will not be resolved. I am still new to gcc development. So, can anyone tell me how can I make gcc emit this variable? Thanks, Harshit
Re: Emit a variable defined in gcc
Hey Martin, Thanks for your reply. Actually I am trying to have a callback function allowing gcc to fetch shadow offset from runtime code. In order to make sure that my users have applied this patch before using asan feature, I want to define a variable in gcc (could be an integer) which will be referenced by the asan library in our source code. I think I used the wrong word 'emit' in my previous post. The variable say "__asan_gccpatch_present" needs to be defined in gcc and then referenced by our code (just like we do with functions such as __builtin_expect). Thanks, Harshit On Tue, Jun 30, 2020 at 12:34 AM Martin Liška wrote: > On 6/30/20 7:55 AM, Harshit Sharma via Gcc wrote: > > Hello, > > I am working on a gcc patch for asan. > > Hey. > > Good to hear, what kind of feature is that? > > > The patch is almost ready except one > > thing. To make sure that the user has applied this patch before using > asan > > feature, I want to declare an additional variable in gcc which is > reference > > by our source code so that if this patch is missing, the user gets an > error > > compiling the code because the reference to this variable will not be > > resolved. > > A nice example can be emission of global variables that are used for > -fprofile-generate: > see gcc/tree-profile.c:194-202. > > Let me know if it helps? > Martin > > > > > I am still new to gcc development. So, can anyone tell me how can I make > > gcc emit this variable? > > > > > > Thanks, > > Harshit > > > >
Re: Emit a variable defined in gcc
Actually these are two separate things. My callback function to fetch shadow offset from user code is ready. This function is defined in my user code and will be called by compiler (quite similar to how __asan_stack_malloc_ function is implemented in gcc/asan.c). Now in order to make sure that my users have applied this gcc patch to their compilers, I want a have a variable __asan_gcc_patch_present which will be defined inside gcc but will be used by user code. This way if they build the program without applying the patch, they will get a compile error as the reference to this variable will not be resolved. This is how I have defined the variable. But I am not sure how I can make this variable accessible by the user code. id = get_identifier ("__asan_gcc_patch_present"); decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl), VAR_DECL, id, integer_type_node); DECL_INITIAL(decl) = integer_one_node; Please tell me what I am doing wrong. -Harshit On Wed, Jul 1, 2020 at 12:03 AM Martin Liška wrote: > On 6/30/20 6:52 PM, Harshit Sharma wrote: > > Hey Martin, > > > > Thanks for your reply. Actually I am trying to have a callback function > allowing gcc to fetch shadow offset from runtime code. > > Ah, all right! > > > > > In order to make sure that my users have applied this patch before using > asan feature, I want to define a variable in gcc (could be an integer) > which will be referenced by the asan library in our source code. I think I > used the wrong word 'emit' in my previous post. The variable say > "__asan_gccpatch_present" needs to be defined in gcc and then referenced by > our code (just like we do with functions such as __builtin_expect). > > Then what about adding a new ASAN variable that you will directly access > from your source code? > What kind of interaction do you need? Or you can add a new ASAN builtin > (gcc/sanitizer.def), something like > __asan_poison_stack_memory that can be used in a user code? > > Martin > > > > > > > Thanks, > > Harshit > > > > On Tue, Jun 30, 2020 at 12:34 AM Martin Liška mli...@suse.cz>> wrote: > > > > On 6/30/20 7:55 AM, Harshit Sharma via Gcc wrote: > > > Hello, > > > I am working on a gcc patch for asan. > > > > Hey. > > > > Good to hear, what kind of feature is that? > > > > > The patch is almost ready except one > > > thing. To make sure that the user has applied this patch before > using asan > > > feature, I want to declare an additional variable in gcc which is > reference > > > by our source code so that if this patch is missing, the user > gets an error > > > compiling the code because the reference to this variable will > not be > > > resolved. > > > > A nice example can be emission of global variables that are used for > -fprofile-generate: > > see gcc/tree-profile.c:194-202. > > > > Let me know if it helps? > > Martin > > > > > > > > I am still new to gcc development. So, can anyone tell me how can > I make > > > gcc emit this variable? > > > > > > > > > Thanks, > > > Harshit > > > > > > >
Re: Emit a variable defined in gcc
Thanks Martin. I liked your idea of using __builtin___asan_version_mismatch_check_v8(). But now, I am getting a compile error. ( error: implicit declaration of function '__builtin___asan_version_mismatch_check_v8'; ) It means the reference to this function is not resolved. So, I guess gcc is not emitting this function. What could be the issue here? Btw I am using fsanitize=kernel-address for my project. Even if I use fsanitize=address, the reference to this function will not be resolved. -Harshit On Wed, Jul 1, 2020 at 4:14 AM Martin Liška wrote: > On 7/1/20 10:54 AM, Harshit Sharma wrote: > > Actually these are two separate things. My callback function to fetch > shadow offset from user code is ready. This function is defined in my user > code and will be called by compiler (quite similar to how > __asan_stack_malloc_ function is implemented in gcc/asan.c). > > All right. > > > > > Now in order to make sure that my users have applied this gcc patch to > their compilers, I want a have a variable __asan_gcc_patch_present which > will be defined inside gcc but will be used by user code. This way if they > build the program without applying the patch, they will get a compile error > as the reference to this variable will not be resolved. > > Note that this detection is fragile as one can do: > > new-gcc -fsanitize=address -c foo.c > old-gcc -fsanitize=address -c bar.c > new-gcc foo.o bar.o -fsanitize=address -o a.out > > will be happy, but apparently bar.o is compiled with a wrong compiler. > > What you want instead is to use ./xgcc -B. /tmp/foo.c -c > -fsanitize=address -fdump-tree-optimized=/dev/stdout > > ... > _sub_I_00099_0 () > { > : >__builtin___asan_init (); >__builtin___asan_version_mismatch_check_v8 (); >return; > > } > ... > > as seen constructor of each compilation unit calls > __builtin___asan_version_mismatch_check_v8. So you just want to bump > libsanitizer/asan/asan_init_version.h to > __builtin___asan_version_mismatch_check_v10 (note that v9 is taken on some > targets). > And change the builtin in gcc/sanitizer.def. > > Martin > > > > > This is how I have defined the variable. But I am not sure how I can > make this variable accessible by the user code. > > > >id = get_identifier ("__asan_gcc_patch_present"); > >decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl), > VAR_DECL, id, integer_type_node); > >DECL_INITIAL(decl) = integer_one_node; > > > > Please tell me what I am doing wrong. > > > > -Harshit > > > > On Wed, Jul 1, 2020 at 12:03 AM Martin Liška mli...@suse.cz>> wrote: > > > > On 6/30/20 6:52 PM, Harshit Sharma wrote: > > > Hey Martin, > > > > > > Thanks for your reply. Actually I am trying to have a callback > function allowing gcc to fetch shadow offset from runtime code. > > > > Ah, all right! > > > > > > > > In order to make sure that my users have applied this patch > before using asan feature, I want to define a variable in gcc (could be an > integer) which will be referenced by the asan library in our source code. I > think I used the wrong word 'emit' in my previous post. The variable say > "__asan_gccpatch_present" needs to be defined in gcc and then referenced by > our code (just like we do with functions such as __builtin_expect). > > > > Then what about adding a new ASAN variable that you will directly > access from your source code? > > What kind of interaction do you need? Or you can add a new ASAN > builtin (gcc/sanitizer.def), something like > > __asan_poison_stack_memory that can be used in a user code? > > > > Martin > > > > > > > > > > > Thanks, > > > Harshit > > > > > > On Tue, Jun 30, 2020 at 12:34 AM Martin Liška <mailto:mli...@suse.cz> <mailto:mli...@suse.cz <mailto:mli...@suse.cz>>> > wrote: > > > > > > On 6/30/20 7:55 AM, Harshit Sharma via Gcc wrote: > > > > Hello, > > > > I am working on a gcc patch for asan. > > > > > > Hey. > > > > > > Good to hear, what kind of feature is that? > > > > > > > The patch is almost ready except one > > > > thing. To make sure that the user has applied this patch > before using asan > > > > feature, I want to declare an additional variable in gcc > which is refe