Index: lib/Basic/Targets/BPF.h =================================================================== --- lib/Basic/Targets/BPF.h +++ lib/Basic/Targets/BPF.h @@ -46,7 +46,8 @@ MacroBuilder &Builder) const override; bool hasFeature(StringRef Feature) const override { - return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris"; + return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris" || + Feature == "offsetreloc"; } void setFeatureEnabled(llvm::StringMap &Features, StringRef Name, Index: lib/CodeGen/CGExpr.cpp =================================================================== --- lib/CodeGen/CGExpr.cpp +++ lib/CodeGen/CGExpr.cpp @@ -3352,6 +3352,15 @@ llvm::Value *eltPtr = emitArraySubscriptGEP( CGF, addr.getPointer(), indices, inbounds, signedIndices, loc, name); + + // Remember the original array subscript for bpf target + auto Arch = CGF.getTarget().getTriple().getArch(); + if (Arch == llvm::Triple::bpfeb || Arch == llvm::Triple::bpfel) + return Address(CGF.Builder.CreatePreserveDIAccessIndex( + eltPtr, addr.getPointer(), StringRef(), + cast(indices.back())->getZExtValue()), + eltAlign); + return Address(eltPtr, eltAlign); } @@ -3932,9 +3941,31 @@ // a barrier every time CXXRecord field with vptr is referenced. addr = Address(Builder.CreateLaunderInvariantGroup(addr.getPointer()), addr.getAlignment()); + + // Remember the original union field index for bpf target + auto Arch = CGM.getTarget().getTriple().getArch(); + if (Arch == llvm::Triple::bpfeb || Arch == llvm::Triple::bpfel) + addr = Address( + Builder.CreatePreserveDIAccessIndex(addr.getPointer(), + addr.getPointer(), + rec->getName(), + field->getFieldIndex()), + addr.getAlignment()); } else { // For structs, we GEP to the field that the record layout suggests. - addr = emitAddrOfFieldStorage(*this, addr, field); + Address naddr = emitAddrOfFieldStorage(*this, addr, field); + + // Remember the original struct field index for bpf target + auto Arch = CGM.getTarget().getTriple().getArch(); + if (Arch != llvm::Triple::bpfeb && Arch != llvm::Triple::bpfel) + addr = std::move(naddr); + else + addr = Address( + Builder.CreatePreserveDIAccessIndex(naddr.getPointer(), + addr.getPointer(), + rec->getName(), + field->getFieldIndex()), + naddr.getAlignment()); // If this is a reference field, load the reference right now. if (FieldType->isReferenceType()) {