Good point! New patch attached.
Le lun. 22 avr. 2024 à 15:13, Antoni Boucher <boua...@zoho.com> a écrit : > > Please move the function to be on lvalue since there are no rvalue types > that are not lvalues that have a name. > > Le 2024-04-22 à 09 h 04, Guillaume Gomez a écrit : > > Hey Arthur :) > > > >> Is there any reason for that getter to return a mutable pointer to the > >> name? Would something like this work instead if you're just looking at > >> getting the name? > >> > >> + virtual string * get_name () const { return NULL; } > >> > >> With of course adequate modifications to the inheriting classes. > > > > Good catch, thanks! > > > > Updated the patch and attached the new version to this email. > > > > Cordially. > > > > Le lun. 22 avr. 2024 à 11:51, Arthur Cohen <arthur.co...@embecosm.com> a > > écrit : > >> > >> Hey Guillaume :) > >> > >> On 4/20/24 01:05, Guillaume Gomez wrote: > >>> Hi, > >>> > >>> I just encountered the need to retrieve the name of an `rvalue` (if > >>> there is one) while working on the Rust GCC backend. > >>> > >>> This patch adds a getter to retrieve the information. > >>> > >>> Cordially. > >> > >>> virtual bool get_wide_int (wide_int *) const { return false; } > >>> > >>> + virtual string * get_name () { return NULL; } > >>> + > >>> private: > >>> virtual enum precedence get_precedence () const = 0; > >> > >> Is there any reason for that getter to return a mutable pointer to the > >> name? Would something like this work instead if you're just looking at > >> getting the name? > >> > >> + virtual string * get_name () const { return NULL; } > >> > >> With of course adequate modifications to the inheriting classes. > >> > >> Best, > >> > >> Arthur
From 79a5af70787509f0f23dc131a39ed32a88d8f8fc Mon Sep 17 00:00:00 2001 From: Guillaume Gomez <guillaume1.go...@gmail.com> Date: Sat, 20 Apr 2024 01:02:20 +0200 Subject: [PATCH] [PATCH] Add rvalue::get_name method gcc/jit/ChangeLog: * jit-recording.h: Add rvalue::get_name method * libgccjit.cc (gcc_jit_rvalue_get_name): Likewise * libgccjit.h (gcc_jit_rvalue_get_name): Likewise * libgccjit.map: Likewise gcc/testsuite/ChangeLog: * jit.dg/test-tls.c: Add test for gcc_jit_rvalue_get_name --- gcc/jit/jit-recording.h | 7 +++++++ gcc/jit/libgccjit.cc | 16 ++++++++++++++++ gcc/jit/libgccjit.h | 4 ++++ gcc/jit/libgccjit.map | 5 +++++ gcc/testsuite/jit.dg/test-tls.c | 2 ++ 5 files changed, 34 insertions(+) diff --git a/gcc/jit/jit-recording.h b/gcc/jit/jit-recording.h index d8d16f4fe29..a80327b26ba 100644 --- a/gcc/jit/jit-recording.h +++ b/gcc/jit/jit-recording.h @@ -1267,6 +1267,7 @@ public: void set_register_name (const char *reg_name); void set_alignment (unsigned bytes); unsigned get_alignment () const { return m_alignment; } + virtual string * get_name () const { return NULL; } protected: string *m_link_section; @@ -1305,6 +1306,8 @@ public: const char *access_as_rvalue (reproducer &r) final override; const char *access_as_lvalue (reproducer &r) final override; + string * get_name () const final override { return m_name; } + private: string * make_debug_string () final override { return m_name; } void write_reproducer (reproducer &r) final override; @@ -1558,6 +1561,8 @@ public: void set_rvalue_init (rvalue *val) { m_rvalue_init = val; } + string * get_name () const final override { return m_name; } + private: string * make_debug_string () final override { return m_name; } template <typename T> @@ -2148,6 +2153,8 @@ public: void write_to_dump (dump &d) final override; + string * get_name () const final override { return m_name; } + private: string * make_debug_string () final override { return m_name; } void write_reproducer (reproducer &r) final override; diff --git a/gcc/jit/libgccjit.cc b/gcc/jit/libgccjit.cc index 445c0d0e0e3..ea03afcd2c5 100644 --- a/gcc/jit/libgccjit.cc +++ b/gcc/jit/libgccjit.cc @@ -4377,3 +4377,19 @@ gcc_jit_context_add_top_level_asm (gcc_jit_context *ctxt, RETURN_IF_FAIL (asm_stmts, ctxt, NULL, "NULL asm_stmts"); ctxt->add_top_level_asm (loc, asm_stmts); } + +/* Public entrypoint. See description in libgccjit.h. + + After error-checking, this calls the trivial + gcc::jit::recording::lvalue::get_name method, in jit-recording.h. */ + +extern const char * +gcc_jit_lvalue_get_name (gcc_jit_lvalue *lvalue) +{ + RETURN_NULL_IF_FAIL (lvalue, NULL, NULL, "NULL lvalue"); + auto name = lvalue->get_name (); + + if (!name) + return NULL; + return name->c_str (); +} diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h index 74e847b2dec..2ea85f5a4c3 100644 --- a/gcc/jit/libgccjit.h +++ b/gcc/jit/libgccjit.h @@ -2066,6 +2066,10 @@ gcc_jit_lvalue_add_string_attribute (gcc_jit_lvalue *variable, enum gcc_jit_variable_attribute attribute, const char* value); +/* Returns the name of the `lvalue`, if any. Returns NULL otherwise. */ +extern const char * +gcc_jit_lvalue_get_name (gcc_jit_lvalue *lvalue); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map index 99aa5970be1..3f96f44dc03 100644 --- a/gcc/jit/libgccjit.map +++ b/gcc/jit/libgccjit.map @@ -289,3 +289,8 @@ LIBGCCJIT_ABI_27 { global: gcc_jit_context_new_sizeof; } LIBGCCJIT_ABI_26; + +LIBGCCJIT_ABI_28 { + global: + gcc_jit_lvalue_get_name; +} LIBGCCJIT_ABI_27; diff --git a/gcc/testsuite/jit.dg/test-tls.c b/gcc/testsuite/jit.dg/test-tls.c index 3b20182ac10..a6a967eac56 100644 --- a/gcc/testsuite/jit.dg/test-tls.c +++ b/gcc/testsuite/jit.dg/test-tls.c @@ -28,6 +28,8 @@ create_code (gcc_jit_context *ctxt, void *user_data) ctxt, NULL, GCC_JIT_GLOBAL_EXPORTED, int_type, "foo"); gcc_jit_lvalue_set_tls_model (foo, GCC_JIT_TLS_MODEL_GLOBAL_DYNAMIC); + CHECK_STRING_VALUE (gcc_jit_lvalue_get_name (foo), "foo"); + /* Build the test_fn. */ gcc_jit_function *test_fn = gcc_jit_context_new_function (ctxt, NULL, -- 2.24.1.2762.gfe2e4819b8