On 11/19/19 7:44 PM, Andrii Nakryiko wrote: > So, to summarize, we proceed with uint64_t for everything, with added > bits of weak vs strong handling. Then in parallel we'll work on adding > BTF for externs and __builtin_extern_resolved (and corresponding new > kind of BTF relocation) and will keep making this whole API even > better, while already having something useful and extensible. I didn't know extern can be weak. That was a good find. Indeed undefined config_* can be represented as uint64 zero value. But I still have an issue with 'proceed uint64_t for everything', since strings and tri-state don't fit into uint64. How about strtol be applied by libbpf only for things that parse successfully (like decimal and hex) and everything else will be represented raw ? Like CONFIG=y will be 121. CONFIG=m will be 109 CONFIG="abc" will be 0x636261 In other words CONFIG_A is an address and 'extern weak uint64_t CONFIG_A' reads raw bytes from that location. When that CONFIG_A is undefined in /boot/config.gz the u64 read from that address will return zero. u8 read from that address will return zero too.