[llvm] 33891af - [MC] Avoid arithmetic between different enumeration types. NFC (#228966)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 4 20:43:45 PDT 2026
Author: Fangrui Song
Date: 2026-10-05T03:43:38Z
New Revision: 33891afe2ebb48678b15ec9ce2223e3010a6c776
URL: https://github.com/llvm/llvm-project/commit/33891afe2ebb48678b15ec9ce2223e3010a6c776
DIFF: https://github.com/llvm/llvm-project/commit/33891afe2ebb48678b15ec9ce2223e3010a6c776.diff
LOG: [MC] Avoid arithmetic between different enumeration types. NFC (#228966)
They are deprecated in C++20 and ill-formed in C++26 (P2864R2).
* Make FirstLiteralRelocationKind and FirstTargetFixupKind constants,
fixing code like `FirstLiteralRelocationKind + ELF::R_*`
* Make the MachO section attributes constants, fixing
`MachO::S_COALESCED | MachO::S_ATTR_*` in MC and lld/MachO.
Added:
Modified:
llvm/include/llvm/BinaryFormat/MachO.h
llvm/include/llvm/MC/MCFixup.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/MachO.h b/llvm/include/llvm/BinaryFormat/MachO.h
index 0c80b5d458dbc..ecf9f36fdffcf 100644
--- a/llvm/include/llvm/BinaryFormat/MachO.h
+++ b/llvm/include/llvm/BinaryFormat/MachO.h
@@ -183,44 +183,40 @@ enum SectionType : uint32_t {
LAST_KNOWN_SECTION_TYPE = S_INIT_FUNC_OFFSETS
};
-enum : uint32_t {
- // Constant masks for the "flags[31:24]" field in llvm::MachO::section and
- // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_USR)
-
- /// S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine
- /// instructions.
- S_ATTR_PURE_INSTRUCTIONS = 0x80000000u,
- /// S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be
- /// in a ranlib table of contents.
- S_ATTR_NO_TOC = 0x40000000u,
- /// S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section
- /// in files with the MY_DYLDLINK flag.
- S_ATTR_STRIP_STATIC_SYMS = 0x20000000u,
- /// S_ATTR_NO_DEAD_STRIP - No dead stripping.
- S_ATTR_NO_DEAD_STRIP = 0x10000000u,
- /// S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
- S_ATTR_LIVE_SUPPORT = 0x08000000u,
- /// S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by
- /// dyld.
- S_ATTR_SELF_MODIFYING_CODE = 0x04000000u,
- /// S_ATTR_DEBUG - A debug section.
- S_ATTR_DEBUG = 0x02000000u,
-
- // Constant masks for the "flags[23:8]" field in llvm::MachO::section and
- // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_SYS)
-
- /// S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions.
- S_ATTR_SOME_INSTRUCTIONS = 0x00000400u,
- /// S_ATTR_EXT_RELOC - Section has external relocation entries.
- S_ATTR_EXT_RELOC = 0x00000200u,
- /// S_ATTR_LOC_RELOC - Section has local relocation entries.
- S_ATTR_LOC_RELOC = 0x00000100u,
-
- // Constant masks for the value of an indirect symbol in an indirect
- // symbol table
- INDIRECT_SYMBOL_LOCAL = 0x80000000u,
- INDIRECT_SYMBOL_ABS = 0x40000000u
-};
+// Constant masks for the "flags[31:24]" field in llvm::MachO::section and
+// llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_USR)
+
+/// Section contains only true machine instructions.
+constexpr uint32_t S_ATTR_PURE_INSTRUCTIONS = 0x80000000u;
+/// Section contains coalesced symbols that are not to be in a ranlib table of
+/// contents.
+constexpr uint32_t S_ATTR_NO_TOC = 0x40000000u;
+/// Ok to strip static symbols in this section in files with the MY_DYLDLINK
+/// flag.
+constexpr uint32_t S_ATTR_STRIP_STATIC_SYMS = 0x20000000u;
+/// No dead stripping.
+constexpr uint32_t S_ATTR_NO_DEAD_STRIP = 0x10000000u;
+/// Blocks are live if they reference live blocks.
+constexpr uint32_t S_ATTR_LIVE_SUPPORT = 0x08000000u;
+/// Used with i386 code stubs written on by dyld.
+constexpr uint32_t S_ATTR_SELF_MODIFYING_CODE = 0x04000000u;
+/// A debug section.
+constexpr uint32_t S_ATTR_DEBUG = 0x02000000u;
+
+// Constant masks for the "flags[23:8]" field in llvm::MachO::section and
+// llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_SYS)
+
+/// Section contains some machine instructions.
+constexpr uint32_t S_ATTR_SOME_INSTRUCTIONS = 0x00000400u;
+/// Section has external relocation entries.
+constexpr uint32_t S_ATTR_EXT_RELOC = 0x00000200u;
+/// Section has local relocation entries.
+constexpr uint32_t S_ATTR_LOC_RELOC = 0x00000100u;
+
+// Constant masks for the value of an indirect symbol in an indirect symbol
+// table.
+constexpr uint32_t INDIRECT_SYMBOL_LOCAL = 0x80000000u;
+constexpr uint32_t INDIRECT_SYMBOL_ABS = 0x40000000u;
enum DataRegionType {
// Constants for the "kind" field in a data_in_code_entry structure
diff --git a/llvm/include/llvm/MC/MCFixup.h b/llvm/include/llvm/MC/MCFixup.h
index aaf75102fb9ed..115a9f0a7430f 100644
--- a/llvm/include/llvm/MC/MCFixup.h
+++ b/llvm/include/llvm/MC/MCFixup.h
@@ -20,14 +20,18 @@ class MCExpr;
/// Extensible enumeration to represent the type of a fixup.
using MCFixupKind = uint16_t;
-enum {
- // [0, FirstLiteralRelocationKind) encodes raw relocation types.
- // [FirstLiteralRelocationKind, FK_NONE) encodes raw relocation types coming
- // from .reloc directives. Fixup kind
- // FirstLiteralRelocationKind+t encodes relocation type t.
- FirstLiteralRelocationKind = 2000,
+// [0, FirstLiteralRelocationKind) encodes raw relocation types.
+//
+// [FirstLiteralRelocationKind, FK_NONE) encodes raw relocation types coming
+// from .reloc directives. Fixup kind FirstLiteralRelocationKind+t encodes
+// relocation type t.
+//
+// The range boundaries are not enumerators, so that arithmetic with ELF::R_*
+// or target fixup enumerators does not mix enumeration types.
+constexpr MCFixupKind FirstLiteralRelocationKind = 2000;
+enum {
// Other kinds indicate the fixup may resolve to a constant, allowing the
// assembler to update the instruction or data directly without a relocation.
FK_NONE = 4000, ///< A no-op fixup.
@@ -40,10 +44,10 @@ enum {
FK_SecRel_2, ///< A two-byte section relative fixup.
FK_SecRel_4, ///< A four-byte section relative fixup.
FK_SecRel_8, ///< A eight-byte section relative fixup.
-
- FirstTargetFixupKind,
};
+constexpr MCFixupKind FirstTargetFixupKind = FK_SecRel_8 + 1;
+
/// Encode information on a single operation to perform on a byte
/// sequence (e.g., an encoded instruction) which requires assemble- or run-
/// time patching.
More information about the llvm-commits
mailing list