Comments (8)
I'm not convinced we're doing something sane here -- it looks like we're 32-bit aligned unless the base type is 8 bits or the bit field width is larger than 32. I think we should at least be consistent about whether we align to bit field length or to the base type length.
@aswaterman @sorear Thoughts?
palmer gamma02 ~ $ cat test.c
#include <stdint.h>
struct bf {
uint32_t a: 1;
uint32_t b;
uint32_t c: 3;
uint32_t d;
uint64_t e: 1;
uint32_t f;
uint64_t g: 32;
uint32_t h;
uint64_t i: 64;
uint32_t j;
uint8_t k: 1;
uint8_t l;
};
void func(uint64_t);
extern struct bf bf;
uint32_t main() {
func(bf.a);
func(bf.b);
func(bf.c);
func(bf.d);
func(bf.e);
func(bf.f);
func(bf.g);
func(bf.h);
func(bf.i);
func(bf.j);
func(bf.k);
func(bf.l);
}
palmer gamma02 ~ $ riscv64-unknown-linux-gnu-gcc test.c -O3 -S -o -
.file "test.c"
.option nopic
.section .text.startup,"ax",@progbits
.align 2
.globl main
.type main, @function
main:
add sp,sp,-16
sd s0,0(sp)
lui s0,%hi(bf)
lbu a0,%lo(bf)(s0)
sd ra,8(sp)
add s0,s0,%lo(bf)
and a0,a0,1
call func
lwu a0,4(s0)
call func
lbu a0,8(s0)
and a0,a0,7
call func
lwu a0,12(s0)
call func
lbu a0,16(s0)
and a0,a0,1
call func
lwu a0,20(s0)
call func
lwu a0,24(s0)
call func
lwu a0,28(s0)
call func
ld a0,32(s0)
call func
lwu a0,40(s0)
call func
lbu a0,44(s0)
and a0,a0,1
call func
lbu a0,45(s0)
call func
ld ra,8(sp)
ld s0,0(sp)
add sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (GNU) 6.1.0"
from riscv-elf-psabi-doc.
It looks like rv64 matches aarch64 and x86-64 in this example, which is sane enough for me. I propose keeping as-is and documenting the behavior.
from riscv-elf-psabi-doc.
If it matches then we should keep it -- plus, that makes it easier to document. @sorear assuming you're OK with this, can you write it up?
from riscv-elf-psabi-doc.
Does anyone have time to document what GCC actually does for bit fields?
from riscv-elf-psabi-doc.
I'll take a stab at it
from riscv-elf-psabi-doc.
Not sure if this is everything, but it is a start:
Bitfields are packed in little-endian fashion. A bitfield that would span the alignment boundary of its integer type is padded to begin at the next alignment boundary. For example, struct { int x : 10; int y : 12; }
is a 32-bit type with x
in bits 9-0, y
in bits 21-10, and bits 31-22 undefined. By contrast, struct { short x : 10; short y : 12; }
is a 32-bit type with x
in bits 9-0, y
in bits 27-16, and bits 31-28 and 15-10 undefined.
from riscv-elf-psabi-doc.
from riscv-elf-psabi-doc.
Thanks, Jim. I'll make a PR.
from riscv-elf-psabi-doc.
Related Issues (20)
- Specify relocation overflow checks HOT 1
- Specify a platform reserved register HOT 20
- Should calling convention also define ptrdiff_t? HOT 1
- Should we use lw/sw in push pop when we used ILP32, whether it's RV32 or RV64 HOT 3
- Operation semantics of __bf16 datatype HOT 2
- representation of GNU C fixed-size vectors HOT 4
- Deprecate R_RISCV_RVC_LUI? HOT 4
- Define GOT-Relative data relocation HOT 8
- Embedding R_RISCV_RELAX to another relocations HOT 7
- Define gp(x3) as global VLENB HOT 4
- Bitfield integer calling convention garbled
- Calling convention uses RV64GQ without definition or reference HOT 3
- Calling convention description of va_list et al. are unclear HOT 2
- Interpretation of floating-point types
- Linux ABI for Pointer Masking HOT 19
- New ABI for stack layout and frame pointer scheme HOT 4
- Change branch from "master" to "main" HOT 1
- Add CREL support HOT 3
- Add RELR support HOT 6
- Question about medlow's single 2 GiB address range HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from riscv-elf-psabi-doc.