[llvm] aa7d7b3 - Revert "[IR] Avoid UB in `SymbolTableListTraits`" (#142093)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 29 23:54:00 PDT 2025


Author: Yingwei Zheng
Date: 2025-05-30T14:53:57+08:00
New Revision: aa7d7b3e4a30d414c7e66278bfee24cdbf4223a6

URL: https://github.com/llvm/llvm-project/commit/aa7d7b3e4a30d414c7e66278bfee24cdbf4223a6
DIFF: https://github.com/llvm/llvm-project/commit/aa7d7b3e4a30d414c7e66278bfee24cdbf4223a6.diff

LOG: Revert "[IR] Avoid UB in `SymbolTableListTraits`" (#142093)

Reverts llvm/llvm-project#139096 due to invalid uses of `offsetof` on
non-standard-layout types.

Added: 
    

Modified: 
    llvm/include/llvm/IR/BasicBlock.h
    llvm/include/llvm/IR/Function.h
    llvm/include/llvm/IR/Module.h
    llvm/include/llvm/IR/SymbolTableListTraits.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/IR/BasicBlock.h b/llvm/include/llvm/IR/BasicBlock.h
index 10617db09fde6..9ee0bacb5c258 100644
--- a/llvm/include/llvm/IR/BasicBlock.h
+++ b/llvm/include/llvm/IR/BasicBlock.h
@@ -546,10 +546,6 @@ class BasicBlock final : public Value, // Basic blocks are data objects also
     return &BasicBlock::InstList;
   }
 
-  static size_t getSublistOffset(Instruction *) {
-    return offsetof(BasicBlock, InstList);
-  }
-
   /// Dedicated function for splicing debug-info: when we have an empty
   /// splice (i.e. zero instructions), the caller may still intend any
   /// debug-info in between the two "positions" to be spliced.

diff  --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index 63100568d07e4..6d4a53da7ff22 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -811,10 +811,6 @@ class LLVM_ABI Function : public GlobalObject, public ilist_node<Function> {
     return &Function::BasicBlocks;
   }
 
-  static size_t getSublistOffset(BasicBlock *) {
-    return offsetof(Function, BasicBlocks);
-  }
-
 public:
   const BasicBlock       &getEntryBlock() const   { return front(); }
         BasicBlock       &getEntryBlock()         { return front(); }

diff  --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h
index a305dd99962c0..0dc8164b9c950 100644
--- a/llvm/include/llvm/IR/Module.h
+++ b/llvm/include/llvm/IR/Module.h
@@ -608,9 +608,6 @@ class LLVM_ABI Module {
   static GlobalListType Module::*getSublistAccess(GlobalVariable*) {
     return &Module::GlobalList;
   }
-  static size_t getSublistOffset(GlobalVariable *) {
-    return offsetof(Module, GlobalList);
-  }
   friend class llvm::SymbolTableListTraits<llvm::GlobalVariable>;
 
 public:
@@ -621,9 +618,6 @@ class LLVM_ABI Module {
   static FunctionListType Module::*getSublistAccess(Function*) {
     return &Module::FunctionList;
   }
-  static size_t getSublistOffset(Function *) {
-    return offsetof(Module, FunctionList);
-  }
 
   /// Detach \p Alias from the list but don't delete it.
   void removeAlias(GlobalAlias *Alias) { AliasList.remove(Alias); }
@@ -663,9 +657,6 @@ class LLVM_ABI Module {
   static AliasListType Module::*getSublistAccess(GlobalAlias*) {
     return &Module::AliasList;
   }
-  static size_t getSublistOffset(GlobalAlias *) {
-    return offsetof(Module, AliasList);
-  }
   friend class llvm::SymbolTableListTraits<llvm::GlobalAlias>;
 
   /// Get the Module's list of ifuncs (constant).
@@ -676,9 +667,6 @@ class LLVM_ABI Module {
   static IFuncListType Module::*getSublistAccess(GlobalIFunc*) {
     return &Module::IFuncList;
   }
-  static size_t getSublistOffset(GlobalIFunc *) {
-    return offsetof(Module, IFuncList);
-  }
   friend class llvm::SymbolTableListTraits<llvm::GlobalIFunc>;
 
   /// Get the Module's list of named metadata (constant).

diff  --git a/llvm/include/llvm/IR/SymbolTableListTraits.h b/llvm/include/llvm/IR/SymbolTableListTraits.h
index 456833fff62ce..fcf6f0fb15280 100644
--- a/llvm/include/llvm/IR/SymbolTableListTraits.h
+++ b/llvm/include/llvm/IR/SymbolTableListTraits.h
@@ -77,8 +77,10 @@ class SymbolTableListTraits : public ilist_alloc_traits<ValueSubClass> {
   /// getListOwner - Return the object that owns this list.  If this is a list
   /// of instructions, it returns the BasicBlock that owns them.
   ItemParentClass *getListOwner() {
-    size_t Offset = ItemParentClass::getSublistOffset(
-        static_cast<ValueSubClass *>(nullptr));
+    size_t Offset = reinterpret_cast<size_t>(
+        &((ItemParentClass *)nullptr->*ItemParentClass::getSublistAccess(
+                                           static_cast<ValueSubClass *>(
+                                               nullptr))));
     ListTy *Anchor = static_cast<ListTy *>(this);
     return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(Anchor)-
                                               Offset);


        


More information about the llvm-commits mailing list