From 36e3aa9e422c768765cc20f61ccb6f82d45010c8 Mon Sep 17 00:00:00 2001 From: Jessica Clarke Date: Tue, 22 Jul 2025 22:54:03 +0100 Subject: [PATCH] [NFC][ELF] Wrap invokeELFT in do { } while (0) so it behaves as a function 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. --- lld/ELF/Target.h | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 93f15920bfedb..f4a6d83dafad2 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -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(__VA_ARGS__); \ - break; \ - case lld::elf::ELF32BEKind: \ - f(__VA_ARGS__); \ - break; \ - case lld::elf::ELF64LEKind: \ - f(__VA_ARGS__); \ - break; \ - case lld::elf::ELF64BEKind: \ - f(__VA_ARGS__); \ - break; \ - default: \ - llvm_unreachable("unknown ctx.arg.ekind"); \ - } + do { \ + switch (ctx.arg.ekind) { \ + case lld::elf::ELF32LEKind: \ + f(__VA_ARGS__); \ + break; \ + case lld::elf::ELF32BEKind: \ + f(__VA_ARGS__); \ + break; \ + case lld::elf::ELF64LEKind: \ + f(__VA_ARGS__); \ + break; \ + case lld::elf::ELF64BEKind: \ + f(__VA_ARGS__); \ + break; \ + default: \ + llvm_unreachable("unknown ctx.arg.ekind"); \ + } \ + } while (0) #endif