public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* extern variable
@ 2009-07-30 14:53 sumanth
  2009-08-02  2:22 ` Michael Eager
  2009-08-02 19:34 ` Jim Wilson
  0 siblings, 2 replies; 8+ messages in thread
From: sumanth @ 2009-07-30 14:53 UTC (permalink / raw)
  To: gcc

Hi,
     How can I make sure the debugging  information printed by my 
compiler for extern variables is correct.
     I am able to print them in gdb in with an _ (underscore). I am 
using Gcc-4.3.4 and gdb 5.3

Thanks,
Sumanth G 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-07-30 14:53 extern variable sumanth
@ 2009-08-02  2:22 ` Michael Eager
  2009-08-02 19:34 ` Jim Wilson
  1 sibling, 0 replies; 8+ messages in thread
From: Michael Eager @ 2009-08-02  2:22 UTC (permalink / raw)
  To: sumanth; +Cc: gcc

sumanth wrote:
> Hi,
>     How can I make sure the debugging  information printed by my 
> compiler for extern variables is correct.

Make sure you compile with -g.  If you don't generate
debug info for the variable, gdb will default to printing
it as an unknown symbol.

-- 
Michael Eager	 eager@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-07-30 14:53 extern variable sumanth
  2009-08-02  2:22 ` Michael Eager
@ 2009-08-02 19:34 ` Jim Wilson
  2009-08-03  4:32   ` sumanth
  1 sibling, 1 reply; 8+ messages in thread
From: Jim Wilson @ 2009-08-02 19:34 UTC (permalink / raw)
  To: sumanth; +Cc: gcc

On 07/30/2009 07:38 AM, sumanth wrote:
> How can I make sure the debugging information printed by my compiler for
> extern variables is correct.
> I am able to print them in gdb in with an _ (underscore). I am using
> Gcc-4.3.4 and gdb 5.3

ELF targets usually don't prepend an underscore to symbol names.  But if 
you are prepending an underscore for some reason, then you need to make 
sure that your ASM_OUTPUT_* macros handle this correctly.  You set 
USER_LABEL_PREFIX to an underscore, and then you add the 
USER_LABEL_PREFIX unless the symbol name starts with '*'.  See the 
ASM_GENERATE_INTERNAL_LABEL docs.  This stuff can be tricky.  You will 
probably have to step through your cc1 port in gdb to see exactly what 
is going on.  It will be useful to look at an existing port that handles 
this correctly; step through it in gdb to see how it works.

Jim

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-08-02 19:34 ` Jim Wilson
@ 2009-08-03  4:32   ` sumanth
  2009-08-03 16:02     ` Jim Wilson
  0 siblings, 1 reply; 8+ messages in thread
From: sumanth @ 2009-08-03  4:32 UTC (permalink / raw)
  To: Jim Wilson; +Cc: gcc

Jim,
      If I  define USER_LABEL_PREFIX "" and declare a global variable 
using names r0/r1...r15 ( my register names ) , my assembler is 
generating an error message saying " r0 is already defined , cannot use 
register in expression " ........

       How can i make sure my tool chain knows the difference between 
global variable r0 and register r0.

Regards,
Sumanth G
      

Jim Wilson wrote:
> On 07/30/2009 07:38 AM, sumanth wrote:
>> How can I make sure the debugging information printed by my compiler for
>> extern variables is correct.
>> I am able to print them in gdb in with an _ (underscore). I am using
>> Gcc-4.3.4 and gdb 5.3
>
> ELF targets usually don't prepend an underscore to symbol names.  But 
> if you are prepending an underscore for some reason, then you need to 
> make sure that your ASM_OUTPUT_* macros handle this correctly.  You 
> set USER_LABEL_PREFIX to an underscore, and then you add the 
> USER_LABEL_PREFIX unless the symbol name starts with '*'.  See the 
> ASM_GENERATE_INTERNAL_LABEL docs.  This stuff can be tricky.  You will 
> probably have to step through your cc1 port in gdb to see exactly what 
> is going on.  It will be useful to look at an existing port that 
> handles this correctly; step through it in gdb to see how it works.
>
> Jim
>
>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-08-03  4:32   ` sumanth
@ 2009-08-03 16:02     ` Jim Wilson
  2009-08-03 18:54       ` sumanth
  0 siblings, 1 reply; 8+ messages in thread
From: Jim Wilson @ 2009-08-03 16:02 UTC (permalink / raw)
  To: sumanth; +Cc: gcc

On Mon, 2009-08-03 at 09:44 +0530, sumanth wrote:
>        How can i make sure my tool chain knows the difference between 
> global variable r0 and register r0.

The simple solution is to either add a prefix to variable names, or to
add a prefix to register names.  In ELF, the convention is to not add a
prefix to variables names, we add a prefix to register names instead if
we need one, e.g. %eax on i386, or $4 on mips.

You can of course choose to add a prefix to variable names.  It just
isn't the convention.  See for instance how the arm-elf port works when
you use the -fleading-underscore option.

A less simple solution is to have an assembler syntax that avoids
ambiguity between register names and variable names.  If for instance
you have a move instruction that can accept either a register or a
variable as source, then you have an ambiguity.  You could instead have
a load instruction for reading memory, and a move instruction for
reading registers, and then you don't have an ambiguity anymore.  You
can also do things with addressing modes and relocation operators to
reduce ambiguities.

Jim


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-08-03 16:02     ` Jim Wilson
@ 2009-08-03 18:54       ` sumanth
  2009-08-03 20:10         ` Jim Wilson
  0 siblings, 1 reply; 8+ messages in thread
From: sumanth @ 2009-08-03 18:54 UTC (permalink / raw)
  To: Jim Wilson; +Cc: gcc

Hi Jim,
that seems to be a promising solution.
If I keep the prefix "_" for a global variable , there is a problem in 
accessing it in gdb...let me explain you with an example

Eg: file1.c
int a = 10;
int main()
{
int b =10;
int c;
c = add( a , b);
return 0;
}

file2.c

int add( int x, int y)
{
return x+y ;
}

 > mycompiler-gcc -g file1.c file2.c
 > mycompiler-gdb a.out
  >> when i print "a" in file1.c , i am able to see value 10;
  >> when i print "a" int file2.c, it prints , no symbol defined. 
Instead I can access it with " print _a"

Thats the problem; guess i am clear this time.

prefixing registers is out of scope for me , as people got used to 
register names r0, r1......

Regards,
Sumanth G

Jim Wilson wrote:
> On Mon, 2009-08-03 at 09:44 +0530, sumanth wrote:
>   
>>        How can i make sure my tool chain knows the difference between 
>> global variable r0 and register r0.
>>     
>
> The simple solution is to either add a prefix to variable names, or to
> add a prefix to register names.  In ELF, the convention is to not add a
> prefix to variables names, we add a prefix to register names instead if
> we need one, e.g. %eax on i386, or $4 on mips.
>
> You can of course choose to add a prefix to variable names.  It just
> isn't the convention.  See for instance how the arm-elf port works when
> you use the -fleading-underscore option.
>
> A less simple solution is to have an assembler syntax that avoids
> ambiguity between register names and variable names.  If for instance
> you have a move instruction that can accept either a register or a
> variable as source, then you have an ambiguity.  You could instead have
> a load instruction for reading memory, and a move instruction for
> reading registers, and then you don't have an ambiguity anymore.  You
> can also do things with addressing modes and relocation operators to
> reduce ambiguities.
>
> Jim
>
>
>
>
>   


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-08-03 18:54       ` sumanth
@ 2009-08-03 20:10         ` Jim Wilson
  2009-08-04 15:35           ` sumanth
  0 siblings, 1 reply; 8+ messages in thread
From: Jim Wilson @ 2009-08-03 20:10 UTC (permalink / raw)
  To: sumanth; +Cc: gcc

On Tue, 2009-08-04 at 00:06 +0530, sumanth wrote:
>  > mycompiler-gcc -g file1.c file2.c
>  > mycompiler-gdb a.out
>   >> when i print "a" in file1.c , i am able to see value 10;
>   >> when i print "a" int file2.c, it prints , no symbol defined. 
> Instead I can access it with " print _a"

This sounds odd, as there is no variable a or _a in file2.c, and if you
can see a variable in one file you should be able to see if with the
same name in another file.

Anyways, I think I already answered this with my first message when I
pointed you at ASM_OUTPUT_* and ASM_GENERATE_INTERNAL_LABEL etc.  If you
compile with -g -S, and look at the assembly language, you will see that
"_a" is being used in the debug info someplace for the variable name
where "a" should be used instead.  "_a" is correct for the variable
address, but not the variable name.  So you will have to step through
your gcc port to figure out why the "_a" is incorrectly printed, and
most likely it is a bug in one of the macros I have mentioned.  Take a
look at a port that handles this correctly to see what they do
differently to make this work.

Jim


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: extern variable
  2009-08-03 20:10         ` Jim Wilson
@ 2009-08-04 15:35           ` sumanth
  0 siblings, 0 replies; 8+ messages in thread
From: sumanth @ 2009-08-04 15:35 UTC (permalink / raw)
  To: Jim Wilson; +Cc: gcc

Hi jim ,
    forgot to mention , I am accessing variable a as extern in file2.c
    I am going through the solutions pointed by you but not able to 
figure out one .


Thanks ,
Sumanth G

Jim Wilson wrote:
> On Tue, 2009-08-04 at 00:06 +0530, sumanth wrote:
>   
>>  > mycompiler-gcc -g file1.c file2.c
>>  > mycompiler-gdb a.out
>>   >> when i print "a" in file1.c , i am able to see value 10;
>>   >> when i print "a" int file2.c, it prints , no symbol defined. 
>> Instead I can access it with " print _a"
>>     
>
> This sounds odd, as there is no variable a or _a in file2.c, and if you
> can see a variable in one file you should be able to see if with the
> same name in another file.
>
> Anyways, I think I already answered this with my first message when I
> pointed you at ASM_OUTPUT_* and ASM_GENERATE_INTERNAL_LABEL etc.  If you
> compile with -g -S, and look at the assembly language, you will see that
> "_a" is being used in the debug info someplace for the variable name
> where "a" should be used instead.  "_a" is correct for the variable
> address, but not the variable name.  So you will have to step through
> your gcc port to figure out why the "_a" is incorrectly printed, and
> most likely it is a bug in one of the macros I have mentioned.  Take a
> look at a port that handles this correctly to see what they do
> differently to make this work.
>
> Jim
>
>
>
>
>   


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-08-04 15:33 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-30 14:53 extern variable sumanth
2009-08-02  2:22 ` Michael Eager
2009-08-02 19:34 ` Jim Wilson
2009-08-03  4:32   ` sumanth
2009-08-03 16:02     ` Jim Wilson
2009-08-03 18:54       ` sumanth
2009-08-03 20:10         ` Jim Wilson
2009-08-04 15:35           ` sumanth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).