bug-gdb
[Top][All Lists]
Advanced

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

Bug in bit fields / gdb & large struct/union


From: Donald Gillies
Subject: Bug in bit fields / gdb & large struct/union
Date: Fri, 7 Sep 2001 16:20:05 -0700

In gdb (4.18) and with gcc (2.9.5), i cannot change the
values of a bit field variable embedded in an elaborate struct/union
with the gdb debugger.  The debugger gladly accepts it when i try to
change the bit field, but i think it's secretly writing the data to
the wrong location in memory (see below).
 
> gcc -v
gcc version 2.95.2 19991024 (release)
> gdb a.out
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i386-unknown-freebsd"...
(gdb) run
Starting program: /usr/home/gillies/a.out 
 
Breakpoint 1, main () at test.c:532
(gdb) print sfr.b.P0B0   ;; look at bit field
$6 = 0 '\000'
(gdb) print sfr.b.P0B0 = 1  ;; set the bit field
$7 = 1 '\001'
(gdb) print sfr.b.P0B0   ;; it's not set !!
$8 = 0 '\000'
(gdb) print sfr.b.PAD0   ;; gdb set 1st char in struct !!
$10 = "\001", '\000' <repeats 126 times>
(gdb) print sfr.b.PAD0[0x80] = 0xff ;; set 0x80'th char where bit field
is
$14 = 255 'ΓΏ'
(gdb) print sfr.b.P0B0   ;; now it's set & reads out OK !!
$15 = 1 '\001'
(gdb) 
 
Apparently, gdb is storing the '1' (line $7) into the wrong location,
but reading out from the correct location (offset 0x80 into the array).
 

Don Gillies -  <mailto:address@hidden> address@hidden -
Graviton, Inc.
EE Faculty, University of British Columbia, Vancouver, B.C. V6T 1Z4,
 <http://www.ece.ubc.ca/~gillies> http://www.ece.ubc.ca/~gillies
 

/////////////////////// source code enclosed //////////////////
 
typedef unsigned char u_char_t;
 
typedef union {
    struct {
 u_char_t pa[0x80];
 
 u_char_t P0;  /* 0x80 */
 u_char_t SP;
 u_char_t DPL;
 u_char_t DPH;
 u_char_t PAD84;
 u_char_t PAD85;
 u_char_t PAD86;
 u_char_t PCON;
 
 u_char_t TCON;  /* 0x8A */
 u_char_t TMOD;
 u_char_t TL0;
 u_char_t TL1;
 u_char_t TH0;
 u_char_t TH1;
 u_char_t CKCON;
 u_char_t PSCTL;
 
 u_char_t P1;  /* 0x90 */
 u_char_t TMR3CN;
 u_char_t TMR3RLL;
 u_char_t TMR3RLH;
 u_char_t TMR3L;
 u_char_t TMR3H;
 u_char_t PAD96;
 u_char_t DSRFLG;
 
 u_char_t SCON;  /* 0x9A */
 u_char_t SBUF;
 u_char_t SPI0CFG;
 u_char_t SPI0DAT;
 u_char_t PADC[1];
 u_char_t SPI0CKR;
 u_char_t CPT0CN;
 u_char_t CPT1CN;
 
 u_char_t P2;  /* 0xA0 */
 u_char_t PADA1;
 u_char_t PADA2;
 u_char_t PADA3;
 u_char_t PRT0CF;
 u_char_t PRT1CF;
 u_char_t PRT2CF;
 u_char_t PRT3CF;
 
 u_char_t IE;  /* 0xA8 */
 u_char_t PADA9;
 u_char_t PADAA;
 u_char_t PADAB;
 u_char_t PADAC;
 u_char_t PRT1IF;
 u_char_t PADAE;
 u_char_t EMI0CN;
 
 u_char_t P3;  /* 0xB0 */
 u_char_t OSCXCN;
 u_char_t OSCICN;
 u_char_t DSRL;
 u_char_t DSRH;
 u_char_t PADB5;
 u_char_t FLSCL;
 u_char_t FLACL;
 
 u_char_t IP;  /* 0xB8 */
 u_char_t PADB9;
 u_char_t AMX0CF;
 u_char_t AMX0SL;
 u_char_t ADC0CF;
 u_char_t PADBD;
 u_char_t ADC0L;
 u_char_t ADC0H;
 
 u_char_t SMB0CN; /* 0xC0 */
 u_char_t SMB0STA;
 u_char_t SMB0DAT;
 u_char_t SMB0ADR;
 u_char_t ADC0GTL;
 u_char_t ADC0GTH;
 u_char_t ADC0LTL;
 u_char_t ADC0LTH;
 
 u_char_t T2CON;  /* 0xC8 */
 u_char_t PADC9;
 u_char_t RCAP2L;
 u_char_t RCAP2H;
 u_char_t TL2;
 u_char_t TH2;
 u_char_t DSROP;
 u_char_t SMB0CR;
 
 u_char_t PSW;  /* 0xD0 */
 u_char_t REF0CN;
 u_char_t DAC0L;
 u_char_t DAC0H;
 u_char_t DAC0CN;
 u_char_t DAC1L;
 u_char_t DAC1H;
 u_char_t DAC1CN;
 
 u_char_t PCA0CN; /* 0xD8 */
 u_char_t PCA0MD;
 u_char_t PCA0CPM0;
 u_char_t PCA0CPM1;
 u_char_t PCA0CPM2;
 u_char_t PCA0CPM3;
 u_char_t PCA0CPM4;
 u_char_t PADD8;
 
 u_char_t ACC;  /* 0xE0 */
 u_char_t XBR0;
 u_char_t XBR1;
 u_char_t XBR2;
 u_char_t PADE4;
 u_char_t PADE5;
 u_char_t EIE1;
 u_char_t EIE2;
 
 u_char_t ADC0CN; /* 0xE8 */
 u_char_t PCA0L;
 u_char_t PCA0CPL0;
 u_char_t PCA0CPL1;
 u_char_t PCA0CPL2;
 u_char_t PCA0CPL3;
 u_char_t PCA0CPL4;
 u_char_t RSTSRC;
 
 u_char_t B;  /* 0xF0 */
 u_char_t PADF1;
 u_char_t PADF2;
 u_char_t PADF3;
 u_char_t PADF4;
 u_char_t PADF5;
 u_char_t EIP1;
 u_char_t EIP2;
 
 u_char_t SPI0CN; /* 0xF8 */
 u_char_t PCA0H;
 u_char_t PCA0CPH0;
 u_char_t PCA0CPH1;
 u_char_t PCA0CPH2;
 u_char_t PCA0CPH3;
 u_char_t PCA0CPH4;
 u_char_t WDTCN;
    } c;
    struct {
 u_char_t PAD0[0x80];
 
 /* darn, have to reverse the order of declarations (in groups
  * of 8) for all the bit variables declared in c8051F.h - what
         * a hassle. */
 
 /*  P0    0x80 */
 u_char_t P0B0:1;
        u_char_t P0B1:1;
 u_char_t P0B2:1;
 u_char_t P0B3:1;
 u_char_t P0B4:1;
 u_char_t P0B5:1;
 u_char_t P0B6:1;
 u_char_t P0B7:1;
 
 /*  TCON  0x88 */
 u_char_t IT0:1;
 u_char_t IE0:1;
 u_char_t IT1:1;
 u_char_t IE1:1;
 u_char_t TR0:1;
 u_char_t TF0:1;
 u_char_t TR1:1;
 u_char_t TF1:1;
 
 u_char_t PAD89[7];
 
 /*  P1    0x90 */
 u_char_t P1B0:1;
        u_char_t P1B1:1;
 u_char_t P1B2:1;
 u_char_t P1B3:1;
 u_char_t P1B4:1;
 u_char_t P1B5:1;
 u_char_t P1B6:1;
 u_char_t P1B7:1;
 
 u_char_t PAD91[7];
 
 /*  SCON  0x98 */
 u_char_t RI:1;
 u_char_t TI:1;
 u_char_t RB8:1;
 u_char_t TB8:1;
 u_char_t REN:1;
 u_char_t SM2:1;
 u_char_t SM1:1;
 u_char_t SM0:1;
 
 u_char_t PAD99[7];
 
 /*  P2  0xA0 */
 u_char_t P2B0:1;
        u_char_t P2B1:1;
 u_char_t P2B2:1;
 u_char_t P2B3:1;
 u_char_t P2B4:1;
 u_char_t P2B5:1;
 u_char_t P2B6:1;
 u_char_t P2B7:1;
 
 u_char_t PADA1[7];
 
 /*  IE  0xA8 */
 u_char_t EX0:1;
 u_char_t ET0:1;
 u_char_t EX1:1;
 u_char_t ET1:1;
 u_char_t ES:1;
 u_char_t ET2:1;
 u_char_t IEGF0:1; /* general purpose flag 0 */
 u_char_t EA:1;
 
 u_char_t PADA9[7];
 
 /*  P3  0xB0 */
 u_char_t P3B0:1;
        u_char_t P3B1:1;
 u_char_t P3B2:1;
 u_char_t P3B3:1;
 u_char_t P3B4:1;
 u_char_t P3B5:1;
 u_char_t P3B6:1;
 u_char_t P3B7:1;
 
 u_char_t PADB1[7];
 
 /*  IP  0xB8 */
 u_char_t PX0:1;
 u_char_t PT0:1;
 u_char_t PX1:1;
 u_char_t PT1:1;
 u_char_t PS:1;
 u_char_t PT2:1;
 
 u_char_t PADB9[7];
 
 /* SMB0CN 0xC0 */
 u_char_t SMBTOE:1;
 u_char_t SMBFTE:1;
 u_char_t AA:1;
 u_char_t SI:1;
 u_char_t STO:1;
 u_char_t STA:1;
 u_char_t ENSMB:1;
 u_char_t BUSY:1;
 
 u_char_t PADC1[7];
 
 /*  T2CON  0xC8 */
 u_char_t CPRL2:1;
 u_char_t CT2:1;
 u_char_t TR2:1;
 u_char_t EXEN2:1;
 u_char_t TCLK:1;
 u_char_t RCLK:1;
 u_char_t EXF2:1;
 u_char_t TF2:1;
 
 u_char_t PADC9[7];
 
 /*  PSW 0xD0 */
 u_char_t P:1;
 u_char_t F1:1;
 u_char_t OV:1;
 u_char_t RS0:1;
 u_char_t RS1:1;
 u_char_t F0:1;
 u_char_t AC:1;
 u_char_t CY:1;
 
 u_char_t PADD1[7];
 
 /* PCA0CN D8H */
 
 u_char_t CCF0:1;
 u_char_t CCF1:1;
 u_char_t CCF2:1;
 u_char_t CCF3:1;
 u_char_t CCF4:1;
 u_char_t CR:1;
 u_char_t CF:1;
 
 u_char_t PAD9[15];
 
 /* ADC0CN E8H */
 u_char_t ADLJST:1;
 u_char_t ADWINT:1;
 u_char_t ADSTM0:1;
 u_char_t ADSTM1:1;
 u_char_t ADBUSY:1;
 u_char_t ADCINT:1;
 u_char_t ADCTM:1;
 u_char_t ADCEN:1;
 
 u_char_t PADE9[15];
 
 /* SPI0CN F8H */
 u_char_t SPIEN:1;
 u_char_t MSTEN:1;
 u_char_t SLVSEL:1;
 u_char_t TXBSY:1;
 u_char_t RXOVRN:1;
 u_char_t MODF:1;
 u_char_t WCOL:1;
 u_char_t SPIF:1;
 
 u_char_t PADF9[1];
    } b;
} sfr_t;
 
#define P0  sfr.c.P0
#define SP  sfr.c.SP
#define DPL  sfr.c.DPL
#define DPH  sfr.c.DPH
#define PCON  sfr.c.PCON
#define TMOD  sfr.c.TMOD
#define TL0  sfr.c.TL0
#define TL1  sfr.c.TL1
#define TH0  sfr.c.TH0
#define TH1  sfr.c.TH1
#define CKCON  sfr.c.CKCON
#define PSCTL  sfr.c.PSCTL
#define P1  sfr.c.P1
#define TMR3CN  sfr.c.TMR3CN
#define TMR3RLL  sfr.c.TMR3RLL
#define TMR3RLH  sfr.c.TMR3RLH
#define TMR3L  sfr.c.TMR3L
#define TMR3H  sfr.c.TMR3H
#define DSRFLG  sfr.c.DSRFLG
#define SCON            sfr.c.SCON
#define SBUF  sfr.c.SBUF
#define SPI0CFG  sfr.c.SPI0CFG
#define SPI0DAT  sfr.c.SPI0DAT
#define SPI0CKR  sfr.c.SPI0CKR
#define CPT0CN  sfr.c.CPT0CN
#define CPT1CN  sfr.c.CPT1CN
#define P2  sfr.c.P2
#define PRT0CF  sfr.c.PRT0CF
#define PRT1CF  sfr.c.PRT1CF
#define PRT2CF  sfr.c.PRT2CF
#define PRT3CF  sfr.c.PRT3CF
#define IE              sfr.c.IE
#define PRT1IF  sfr.c.PRT1IF
#define EMI0CN  sfr.c.EMI0CN
#define P3  sfr.c.P3
#define OSCXCN  sfr.c.OSCXCN
#define OSCICN  sfr.c.OSCICN
#define DSRL  sfr.c.DSRL
#define DSRH  sfr.c.DSRH
#define FLSCL  sfr.c.FLSCL
#define FLACL  sfr.c.FLACL
#define AMX0CF  sfr.c.AMX0CF
#define AMX0SL  sfr.c.AMX0SL
#define ADC0CF  sfr.c.ADC0CF
#define ADC0L  sfr.c.ADC0L
#define ADC0H  sfr.c.ADC0H
#define SMB0STA  sfr.c.SMB0STA
#define SMB0DAT  sfr.c.SMB0DAT
#define SMB0ADR  sfr.c.SMB0ADR
#define ADC0GTL  sfr.c.ADC0GTL
#define ADC0GTH  sfr.c.ADC0GTH
#define ADC0LTL  sfr.c.ADC0LTL
#define ADC0LTH  sfr.c.ADC0LTH
#define T2CON           sfr.c.T2CON
#define RCAP2L  sfr.c.RCAP2L
#define RCAP2H  sfr.c.RCAP2H
#define TL2  sfr.c.TL2
#define TH2  sfr.c.TH2
#define DSROP  sfr.c.DSROP
#define SMB0CR  sfr.c.SMB0CR
#define REF0CN  sfr.c.REF0CN
#define DAC0L  sfr.c.DAC0L
#define DAC0H  sfr.c.DAC0H
#define DAC0CN  sfr.c.DAC0CN
#define DAC1L  sfr.c.DAC1L
#define DAC1H  sfr.c.DAC1H
#define DAC1CN  sfr.c.DAC1CN
#define PCA0MD  sfr.c.PCA0MD
#define PCA0CPM0 sfr.c.PCA0CPM0
#define PCA0CPM1 sfr.c.PCA0CPM1
#define PCA0CPM2 sfr.c.PCA0CPM2
#define PCA0CPM3 sfr.c.PCA0CPM3
#define PCA0CPM4 sfr.c.PCA0CPM4
#define ACC  sfr.c.ACC
#define XBR0  sfr.c.XBR0
#define XBR1  sfr.c.XBR1
#define XBR2  sfr.c.XBR2
#define EIE1  sfr.c.EIE1
#define EIE2  sfr.c.EIE2
#define ADC0CN          sfr.c.ADC0CN
#define PCA0L  sfr.c.PCA0L
#define PCA0CPL0 sfr.c.PCA0CPL0
#define PCA0CPL1 sfr.c.PCA0CPL1
#define PCA0CPL2 sfr.c.PCA0CPL2
#define PCA0CPL3 sfr.c.PCA0CPL3
#define PCA0CPL4 sfr.c.PCA0CPL4
#define RSTSRC  sfr.c.RSTSRC
#define B  sfr.c.B
#define EIP1  sfr.c.EIP1
#define EIP2  sfr.c.EIP2
#define SPI0CN  sfr.c.SPI0CN
#define PCA0H  sfr.c.PCA0H
#define PCA0CPH0 sfr.c.PCA0CPH0
#define PCA0CPH1 sfr.c.PCA0CPH1
#define PCA0CPH2 sfr.c.PCA0CPH2
#define PCA0CPH3 sfr.c.PCA0CPH3
#define PCA0CPH4 sfr.c.PCA0CPH4
#define WDTCN    sfr.c.WDTCN
 

/*  BIT Registers */
 

/*  TCON  0x88 */
#define TF1  sfr.b.TF1
#define TR1  sfr.b.TR1
#define TF0  sfr.b.TF0
#define TR0  sfr.b.TR0
#define IE1  sfr.b.IE1
#define IT1  sfr.b.IT1
#define IE0  sfr.b.IE0
#define IT0  sfr.b.IT0
 
/*  SCON  0x98 */
#define SM0  sfr.b.SM0
#define SM1  sfr.b.SM1
#define SM2  sfr.b.SM2
#define REN  sfr.b.REN
#define TB8  sfr.b.TB8
#define RB8  sfr.b.RB8
#define TI  sfr.b.TI
#define RI  sfr.b.RI
 
/*  IE  0xA8 */
#define EA  sfr.b.EA
#define ET2  sfr.b.ET2
#define ES  sfr.b.ES
#define ET1  sfr.b.ET1
#define EX1  sfr.b.EX1
#define ET0  sfr.b.ET0
#define EX0  sfr.b.EX0
 
/*  IP  0xB8 */
#define PT2  sfr.b.PT2
#define PS  sfr.b.PS
#define PT1  sfr.b.PT1
#define PX1  sfr.b.PX1
#define PT0  sfr.b.PT0
#define PX0  sfr.b.PX0
 
/* SMB0CN 0xC0 */
#define BUSY  sfr.b.BUSY
#define ENSMB  sfr.b.ENSMB
#define STA  sfr.b.STA
#define STO  sfr.b.STO
#define SI  sfr.b.SI
#define AA  sfr.b.AA
#define SMBFTE  sfr.b.SMBFTE
#define SMBTOE  sfr.b.SMBTOE
 
/*  T2CON  0xC8 */
#define TF2  sfr.b.TF2
#define EXF2  sfr.b.EXF2
#define RCLK  sfr.b.RCLK
#define TCLK  sfr.b.TCLK
#define EXEN2  sfr.b.EXEN2
#define TR2  sfr.b.TR2
#define CT2  sfr.b.CT2
#define CPRL2  sfr.b.CPRL2
 
/*  PSW */
#define CY  sfr.b.CY
#define AC  sfr.b.AC
#define F0  sfr.b.F0
#define RS1  sfr.b.RS1
#define RS0  sfr.b.RS0
#define OV  sfr.b.OV
#define F1  sfr.b.F1
#define P  sfr.b.P
 
/* PCA0CN D8H */
#define CF  sfr.b.CF
#define CR  sfr.b.CR
#define CCF4  sfr.b.CCF4
#define CCF3  sfr.b.CCF3
#define CCF2  sfr.b.CCF2
#define CCF1  sfr.b.CCF1
#define CCF0  sfr.b.CCF0
 
/* ADC0CN E8H */
#define ADCEN  sfr.b.ADCEN
#define ADCTM  sfr.b.ADCTM
#define ADCINT  sfr.b.ADCINT
#define ADBUSY  sfr.b.ADBUSY
#define ADSTM1  sfr.b.ADSTM1
#define ADSTM0  sfr.b.ADSTM0
#define ADWINT  sfr.b.ADWINT
#define ADLJST  sfr.b.ADLJST
 
/* SPI0CN F8H */
#define SPIF  sfr.b.SPIF
#define WCOL  sfr.b.WCOL
#define MODF  sfr.b.MODF
#define RXOVRN  sfr.b.RXOVRN
#define TXBSY  sfr.b.TXBSY
#define SLVSEL  sfr.b.SLVSEL
#define MSTEN  sfr.b.MSTEN
#define SPIEN  sfr.b.SPIEN
 
extern sfr_t sfr;
 
#include <stdio.h>
 
sfr_t sfr;
 
main()
{
  printf("hello, world\n");
 
  getchar();
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]