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

via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 22 14:50:37 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld

@llvm/pr-subscribers-lld-elf

Author: Jessica Clarke (jrtc27)

<details>
<summary>Changes</summary>

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.


---
Full diff: https://github.com/llvm/llvm-project/pull/150119.diff


1 Files Affected:

- (modified) lld/ELF/Target.h (+18-16) 


``````````diff
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 93f15920bfedb..fc20dae87584c 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<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

``````````

</details>


https://github.com/llvm/llvm-project/pull/150119


More information about the llvm-commits mailing list