[NFC][ELF] Wrap invokeELFT in do { } while (0) so it behaves as a function (#150119)

The current implementation is dangerous if used in contexts that need a
single statement, since invokeELFT(...); is in fact two statements, a
switch statement and an empty statement.
This commit is contained in:
Jessica Clarke 2025-07-27 00:20:55 +01:00 committed by GitHub
parent 87c73f498d
commit f8685a8533
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -338,21 +338,23 @@ inline uint64_t overwriteULEB128(uint8_t *bufLoc, uint64_t val) {
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#endif
#define invokeELFT(f, ...) \
switch (ctx.arg.ekind) { \
case lld::elf::ELF32LEKind: \
f<llvm::object::ELF32LE>(__VA_ARGS__); \
break; \
case lld::elf::ELF32BEKind: \
f<llvm::object::ELF32BE>(__VA_ARGS__); \
break; \
case lld::elf::ELF64LEKind: \
f<llvm::object::ELF64LE>(__VA_ARGS__); \
break; \
case lld::elf::ELF64BEKind: \
f<llvm::object::ELF64BE>(__VA_ARGS__); \
break; \
default: \
llvm_unreachable("unknown ctx.arg.ekind"); \
}
do { \
switch (ctx.arg.ekind) { \
case lld::elf::ELF32LEKind: \
f<llvm::object::ELF32LE>(__VA_ARGS__); \
break; \
case lld::elf::ELF32BEKind: \
f<llvm::object::ELF32BE>(__VA_ARGS__); \
break; \
case lld::elf::ELF64LEKind: \
f<llvm::object::ELF64LE>(__VA_ARGS__); \
break; \
case lld::elf::ELF64BEKind: \
f<llvm::object::ELF64BE>(__VA_ARGS__); \
break; \
default: \
llvm_unreachable("unknown ctx.arg.ekind"); \
} \
} while (0)
#endif