From: Hengqi Chen Date: Sun, 24 Apr 2022 12:47:28 +0000 (+0000) Subject: bcc: Fix segmentation fault for LLVM 15 X-Git-Tag: accepted/tizen/unified/20240223.064455~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=95bde0ceaca4485c4437183818ba59a524ce199f;p=platform%2Fupstream%2Fbcc.git bcc: Fix segmentation fault for LLVM 15 When BCC is compiled with LLVM 15, running BCC tools will cause segfault. The core dump reveals that the segfault is triggered by the calls to `getPointerElementType()`. This is because LLVM is moving towards `Opaque Pointer` ([0]). This commit follows the migration guide to fix the issue. [0]: https://llvm.org/docs/OpaquePointers.html Signed-off-by: Hengqi Chen --- diff --git a/src/cc/bpf_module_rw_engine.cc b/src/cc/bpf_module_rw_engine.cc index f1649880..7ee3e111 100644 --- a/src/cc/bpf_module_rw_engine.cc +++ b/src/cc/bpf_module_rw_engine.cc @@ -49,7 +49,12 @@ void BPFModule::cleanup_rw_engine() { static LoadInst *createLoad(IRBuilder<> &B, Value *addr, bool isVolatile = false) { -#if LLVM_MAJOR_VERSION >= 14 +#if LLVM_MAJOR_VERSION >= 15 + if (isa(addr)) + return B.CreateLoad(dyn_cast(addr)->getAllocatedType(), addr, isVolatile); + else + return B.CreateLoad(addr->getType(), addr, isVolatile); +#elif LLVM_MAJOR_VERSION >= 14 return B.CreateLoad(addr->getType()->getPointerElementType(), addr, isVolatile); #else return B.CreateLoad(addr, isVolatile); @@ -58,7 +63,12 @@ static LoadInst *createLoad(IRBuilder<> &B, Value *addr, bool isVolatile = false static Value *createInBoundsGEP(IRBuilder<> &B, Value *ptr, ArrayRefidxlist) { -#if LLVM_MAJOR_VERSION >= 14 +#if LLVM_MAJOR_VERSION >= 15 + if (isa(ptr)) + return B.CreateInBoundsGEP(dyn_cast(ptr)->getValueType(), ptr, idxlist); + else + return B.CreateInBoundsGEP(ptr->getType(), ptr, idxlist); +#elif LLVM_MAJOR_VERSION >= 14 return B.CreateInBoundsGEP(ptr->getType()->getScalarType()->getPointerElementType(), ptr, idxlist); #else @@ -116,7 +126,7 @@ static void finish_sscanf(IRBuilder<> &B, vector *args, string *fmt, B.SetInsertPoint(label_false); // s = &s[nread]; B.CreateStore( - createInBoundsGEP(B, createLoad(B, sptr), createLoad(B, nread, true)), sptr); + createInBoundsGEP(B, createLoad(B, sptr), {createLoad(B, nread, true)}), sptr); args->resize(2); fmt->clear(); @@ -400,10 +410,12 @@ int BPFModule::annotate() { table_names_[table.name] = id++; GlobalValue *gvar = mod_->getNamedValue(table.name); if (!gvar) continue; - if (PointerType *pt = dyn_cast(gvar->getType())) { #if LLVM_MAJOR_VERSION >= 15 - StructType *st = dyn_cast(pt->getPointerElementType()); + { + Type *t = gvar->getValueType(); + StructType *st = dyn_cast(t); #else + if (PointerType *pt = dyn_cast(gvar->getType())) { StructType *st = dyn_cast(pt->getElementType()); #endif if (st) {