Skip to content

Commit 6374456

Browse files
committed
[IR] Avoid UB in SymbolTableListTraits
1 parent e59ed0f commit 6374456

File tree

4 files changed

+11
-10
lines changed

4 files changed

+11
-10
lines changed

llvm/include/llvm/IR/SymbolTableListTraits.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,14 @@ class SymbolTableListTraits : public ilist_alloc_traits<ValueSubClass> {
7373
public:
7474
SymbolTableListTraits() = default;
7575

76+
void setListOwner(ItemParentClass *Par) { ListOwner = Par; }
77+
7678
private:
79+
ItemParentClass *ListOwner;
80+
7781
/// getListOwner - Return the object that owns this list. If this is a list
7882
/// of instructions, it returns the BasicBlock that owns them.
79-
ItemParentClass *getListOwner() {
80-
size_t Offset = reinterpret_cast<size_t>(
81-
&((ItemParentClass *)nullptr->*ItemParentClass::getSublistAccess(
82-
static_cast<ValueSubClass *>(
83-
nullptr))));
84-
ListTy *Anchor = static_cast<ListTy *>(this);
85-
return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(Anchor)-
86-
Offset);
87-
}
83+
ItemParentClass *getListOwner() { return ListOwner; }
8884

8985
static ListTy &getList(ItemParentClass *Par) {
9086
return Par->*(Par->getSublistAccess((ValueSubClass*)nullptr));

llvm/lib/IR/BasicBlock.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
187187
BasicBlock *InsertBefore)
188188
: Value(Type::getLabelTy(C), Value::BasicBlockVal),
189189
IsNewDbgInfoFormat(UseNewDbgInfoFormat), Parent(nullptr) {
190-
190+
InstList.setListOwner(this);
191191
if (NewParent)
192192
insertInto(NewParent, InsertBefore);
193193
else

llvm/lib/IR/Function.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace,
495495
NumArgs(Ty->getNumParams()), IsNewDbgInfoFormat(UseNewDbgInfoFormat) {
496496
assert(FunctionType::isValidReturnType(getReturnType()) &&
497497
"invalid return type");
498+
BasicBlocks.setListOwner(this);
498499
setGlobalObjectSubClassData(0);
499500

500501
// We only need a symbol table for a function if the context keeps value names

llvm/lib/IR/Module.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ Module::Module(StringRef MID, LLVMContext &C)
7575
ModuleID(std::string(MID)), SourceFileName(std::string(MID)),
7676
IsNewDbgInfoFormat(UseNewDbgInfoFormat) {
7777
Context.addModule(this);
78+
GlobalList.setListOwner(this);
79+
FunctionList.setListOwner(this);
80+
AliasList.setListOwner(this);
81+
IFuncList.setListOwner(this);
7882
}
7983

8084
Module &Module::operator=(Module &&Other) {

0 commit comments

Comments
 (0)