[Top][All Lists]
[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();
}
- Bug in bit fields / gdb & large struct/union,
Donald Gillies <=