Skip to content

Commit 00a0e8b

Browse files
committed
ICG exclude of class member variables now defines incorrect memory offsets in io_src #311
Missed some bitfield offset calculations.
1 parent ae07b26 commit 00a0e8b

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

trick_source/codegen/Interface_Code_Gen/FieldDescription.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,14 @@ void FieldDescription::setBitFieldWidth(unsigned int len) {
443443
bitfield_width = len ;
444444
}
445445

446+
void FieldDescription::setBitFieldStart(unsigned int sb) {
447+
bitfield_start_bit = sb ;
448+
}
449+
450+
void FieldDescription::setBitFieldByteOffset(unsigned int wo) {
451+
bitfield_word_offset = wo ;
452+
}
453+
446454
unsigned int FieldDescription::getBitFieldWidth() {
447455
return bitfield_width ;
448456
}

trick_source/codegen/Interface_Code_Gen/FieldDescription.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class FieldDescription : public ConstructValues {
6262
std::string getEnumString() ;
6363
void setBitField( bool yes_no ) ;
6464
void setBitFieldWidth( unsigned int len ) ;
65+
void setBitFieldStart( unsigned int len ) ;
66+
void setBitFieldByteOffset( unsigned int len ) ;
6567
unsigned int getBitFieldWidth() ;
6668
unsigned int getBitFieldStart() ;
6769
unsigned int getBitFieldByteOffset() ;

trick_source/codegen/Interface_Code_Gen/FieldVisitor.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ bool FieldVisitor::VisitFieldDecl( clang::FieldDecl *field ) {
215215
if ( field->isBitField()) {
216216
fdes->setBitField(true) ;
217217
fdes->setBitFieldWidth(field->getBitWidthValue(field->getASTContext())) ;
218+
unsigned int field_offset_bits = field->getASTContext().getFieldOffset(field) + fdes->getBaseClassOffset() * 8 ;
219+
fdes->setBitFieldStart( 32 - (field_offset_bits % 32) - fdes->getBitFieldWidth()) ;
220+
fdes->setBitFieldByteOffset((field_offset_bits / 32) * 4 ) ;
218221
}
219222

220223
if ( debug_level >= 3 ) {

0 commit comments

Comments
 (0)