diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 8f4d89a12b1..32f7f42c5d1 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2355,8 +2355,15 @@ void DwarfDebug::emitDebugRanges() { const MCSymbol *End = Range.getEnd(); assert(Begin && "Range without a begin symbol?"); assert(End && "Range without an end symbol?"); - Asm->OutStreamer.EmitSymbolValue(Begin, Size); - Asm->OutStreamer.EmitSymbolValue(End, Size); + if (TheCU->getRanges().size() == 1) { + // Grab the begin symbol from the first range as our base. + const MCSymbol *Base = TheCU->getRanges()[0].getStart(); + Asm->EmitLabelDifference(Begin, Base, Size); + Asm->EmitLabelDifference(End, Base, Size); + } else { + Asm->OutStreamer.EmitSymbolValue(Begin, Size); + Asm->OutStreamer.EmitSymbolValue(End, Size); + } } // And terminate the list with two 0 values. diff --git a/test/DebugInfo/X86/debug-ranges-offset.ll b/test/DebugInfo/X86/debug-ranges-offset.ll new file mode 100644 index 00000000000..365ba171a0d --- /dev/null +++ b/test/DebugInfo/X86/debug-ranges-offset.ll @@ -0,0 +1,241 @@ +; RUN: llc -filetype=obj -mtriple=x86_64-pc-linux-gnu %s -o %t +; RUN: llvm-readobj --relocations %t | FileCheck %s + +; Check that we don't have any relocations in the ranges section - +; to show that we're producing this as a relative offset to the +; low_pc for the compile unit. +; CHECK-NOT: .rela.debug_ranges + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 0, void ()* @__msan_init }] +@str = private unnamed_addr constant [4 x i8] c"zzz\00" +@__msan_retval_tls = external thread_local(initialexec) global [8 x i64] +@__msan_retval_origin_tls = external thread_local(initialexec) global i32 +@__msan_param_tls = external thread_local(initialexec) global [1000 x i64] +@__msan_param_origin_tls = external thread_local(initialexec) global [1000 x i32] +@__msan_va_arg_tls = external thread_local(initialexec) global [1000 x i64] +@__msan_va_arg_overflow_size_tls = external thread_local(initialexec) global i64 +@__msan_origin_tls = external thread_local(initialexec) global i32 +@__executable_start = external hidden global i32 +@_end = external hidden global i32 + +; Function Attrs: sanitize_memory uwtable +define void @_Z1fv() #0 { +entry: + %p = alloca i32*, align 8 + %0 = ptrtoint i32** %p to i64, !dbg !19 + %1 = and i64 %0, -70368744177672, !dbg !19 + %2 = inttoptr i64 %1 to i64*, !dbg !19 + store i64 -1, i64* %2, align 8, !dbg !19 + store i64 0, i64* getelementptr inbounds ([1000 x i64]* @__msan_param_tls, i64 0, i64 0), align 8, !dbg !19 + store i64 0, i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !19 + %call = call i8* @_Znwm(i64 4) #4, !dbg !19 + %_msret = load i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !19 + %3 = bitcast i8* %call to i32*, !dbg !19 + tail call void @llvm.dbg.value(metadata !{i32* %3}, i64 0, metadata !9), !dbg !19 + %4 = inttoptr i64 %1 to i64*, !dbg !19 + store i64 %_msret, i64* %4, align 8, !dbg !19 + store volatile i32* %3, i32** %p, align 8, !dbg !19 + tail call void @llvm.dbg.value(metadata !{i32** %p}, i64 0, metadata !9), !dbg !19 + %p.0.p.0. = load volatile i32** %p, align 8, !dbg !20 + %_msld = load i64* %4, align 8, !dbg !20 + %_mscmp = icmp eq i64 %_msld, 0, !dbg !20 + br i1 %_mscmp, label %6, label %5, !dbg !20, !prof !22 + +;