Author: Abid Qadeer Date: 2026-09-11T12:37:21+01:00 New Revision: 092ac4c2626af97a09d768a63a32a2b4b96f754c
URL: https://github.com/llvm/llvm-project/commit/092ac4c2626af97a09d768a63a32a2b4b96f754c DIFF: https://github.com/llvm/llvm-project/commit/092ac4c2626af97a09d768a63a32a2b4b96f754c.diff LOG: [clang][OpenMP] Don't drop debug location when handing off to OMPIRBuilder. (#219548) All the clang callsites that hand a `LocationDescription` to the `OpenMPIRBuilder` pass `CGF.Builder`. That selects `LocationDescription(const IRBuilderBase &)`, which carries both the insertion point and the current debug location. The 2 call sites fixed in this PR used `CGF.Builder.saveIP()` which passes only an insertion point, selecting `LocationDescription(const InsertPointTy &)`, which leaves `DL` empty. As a result, the IR the builder emitted on clang's behalf came out without `!dbg`. Fixed by passing `CGF.Builder`, as the other callsites do. --------- Co-authored-by: Cursor <[email protected]> Added: clang/test/OpenMP/debug-info-ompirbuilder-handoff.c Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 80d20f3259822..1ad07936e6f05 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1422,7 +1422,7 @@ llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF, // the clang invariants used below might be broken. if (CGM.getLangOpts().OpenMPIRBuilder) { SmallString<128> Buffer; - OMPBuilder.updateToLocation(CGF.Builder.saveIP()); + OMPBuilder.updateToLocation(CGF.Builder); uint32_t SrcLocStrSize; auto *SrcLocStr = OMPBuilder.getOrCreateSrcLocStr( getIdentStringFromSourceLocation(CGF, Loc, Buffer), SrcLocStrSize); @@ -11811,7 +11811,7 @@ void CGOpenMPRuntime::emitTargetDataCalls( CGF.AllocaInsertPt->getIterator()); InsertPointTy CodeGenIP(CGF.Builder.GetInsertBlock(), CGF.Builder.GetInsertPoint()); - llvm::OpenMPIRBuilder::LocationDescription OmpLoc(CodeGenIP); + llvm::OpenMPIRBuilder::LocationDescription OmpLoc(CGF.Builder); llvm::OpenMPIRBuilder::InsertPointTy AfterIP = cantFail(OMPBuilder.createTargetData( OmpLoc, AllocaIP, CodeGenIP, /*DeallocBlocks=*/{}, DeviceID, diff --git a/clang/test/OpenMP/debug-info-ompirbuilder-handoff.c b/clang/test/OpenMP/debug-info-ompirbuilder-handoff.c new file mode 100644 index 0000000000000..036b04a932bb2 --- /dev/null +++ b/clang/test/OpenMP/debug-info-ompirbuilder-handoff.c @@ -0,0 +1,38 @@ +// Check that the debug location clang has established survives the hand-off to +// the OpenMPIRBuilder, so that the IR the builder emits on clang's behalf still +// carries a !dbg attachment. + +// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -triple x86_64-unknown-unknown \ +// RUN: -fopenmp-targets=x86_64-unknown-linux-gnu -debug-info-kind=limited \ +// RUN: -emit-llvm %s -o - | FileCheck %s + +int cond; +void use(int); + +// CGOpenMPRuntime::getThreadID() defers to the OpenMPIRBuilder when it is +// enabled, so the thread-num call is emitted by the builder and must inherit +// the location clang was holding. + +// CHECK-LABEL: define {{.*}}@single_region +// CHECK: entry: +// CHECK-NEXT: call i32 @__kmpc_global_thread_num({{.*}}), !dbg ![[LOC:[0-9]+]] +// CHECK-NEXT: call i32 @__kmpc_single({{.*}}), !dbg ![[LOC]] +void single_region(void) { +#pragma omp single + use(1); +} + +// CGOpenMPRuntime::emitTargetDataCalls() passes the 'if' condition down to +// OpenMPIRBuilder::createTargetData(), which emits the branch on it. The mapper +// calls of the region are not useful here because restoreIP() reinstalls a +// location from the instruction at the insertion point, so they keep their !dbg +// either way; this branch is emitted before that happens and is the only +// observable witness on that path. + +// CHECK-LABEL: define {{.*}}@target_data_if +// CHECK: %[[TOBOOL:.+]] = icmp ne i32 %{{.+}}, 0, !dbg ![[LOC2:[0-9]+]] +// CHECK-NEXT: br i1 %[[TOBOOL]], label %{{.+}}, label %{{.+}}, !dbg ![[LOC2]] +void target_data_if(int *p) { +#pragma omp target data map(tofrom : p[0 : 4]) if (cond) + use(2); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
