Skip to content

Commit f8685a8

Browse files
authored
[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.
1 parent 87c73f4 commit f8685a8

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

lld/ELF/Target.h

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -338,21 +338,23 @@ inline uint64_t overwriteULEB128(uint8_t *bufLoc, uint64_t val) {
338338
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
339339
#endif
340340
#define invokeELFT(f, ...) \
341-
switch (ctx.arg.ekind) { \
342-
case lld::elf::ELF32LEKind: \
343-
f<llvm::object::ELF32LE>(__VA_ARGS__); \
344-
break; \
345-
case lld::elf::ELF32BEKind: \
346-
f<llvm::object::ELF32BE>(__VA_ARGS__); \
347-
break; \
348-
case lld::elf::ELF64LEKind: \
349-
f<llvm::object::ELF64LE>(__VA_ARGS__); \
350-
break; \
351-
case lld::elf::ELF64BEKind: \
352-
f<llvm::object::ELF64BE>(__VA_ARGS__); \
353-
break; \
354-
default: \
355-
llvm_unreachable("unknown ctx.arg.ekind"); \
356-
}
341+
do { \
342+
switch (ctx.arg.ekind) { \
343+
case lld::elf::ELF32LEKind: \
344+
f<llvm::object::ELF32LE>(__VA_ARGS__); \
345+
break; \
346+
case lld::elf::ELF32BEKind: \
347+
f<llvm::object::ELF32BE>(__VA_ARGS__); \
348+
break; \
349+
case lld::elf::ELF64LEKind: \
350+
f<llvm::object::ELF64LE>(__VA_ARGS__); \
351+
break; \
352+
case lld::elf::ELF64BEKind: \
353+
f<llvm::object::ELF64BE>(__VA_ARGS__); \
354+
break; \
355+
default: \
356+
llvm_unreachable("unknown ctx.arg.ekind"); \
357+
} \
358+
} while (0)
357359

358360
#endif

0 commit comments

Comments
 (0)