diff --git a/compiler-rt/lib/xray/xray_interface.cpp b/compiler-rt/lib/xray/xray_interface.cpp --- a/compiler-rt/lib/xray/xray_interface.cpp +++ b/compiler-rt/lib/xray/xray_interface.cpp @@ -183,7 +183,7 @@ const XRaySledMap &InstrMap) XRAY_NEVER_INSTRUMENT { int32_t CurFn = 0; uint64_t LastFnAddr = 0; - XRayFunctionSledIndex Index = {nullptr, nullptr}; + XRayFunctionSledIndex Index = {nullptr, 0}; for (std::size_t I = 0; I < InstrMap.Entries && CurFn <= FuncId; I++) { const auto &Sled = InstrMap.Sleds[I]; @@ -196,12 +196,10 @@ if (CurFn == FuncId) { if (Index.Begin == nullptr) Index.Begin = &Sled; - Index.End = &Sled; + Index.Size = &Sled - Index.Begin + 1; } } - Index.End += 1; - return Index; } @@ -235,13 +233,17 @@ } // Now we patch ths sleds for this specific function. - auto SledRange = InstrMap.SledsIndex ? InstrMap.SledsIndex[FuncId - 1] - : findFunctionSleds(FuncId, InstrMap); + XRayFunctionSledIndex SledRange; + if (InstrMap.SledsIndex) { + SledRange = {InstrMap.SledsIndex[FuncId - 1].fromPCRelative(), + InstrMap.SledsIndex[FuncId - 1].Size}; + } else { + SledRange = findFunctionSleds(FuncId, InstrMap); + } auto *f = SledRange.Begin; - auto *e = SledRange.End; bool SucceedOnce = false; - while (f != e) - SucceedOnce |= patchSled(*f++, Enable, FuncId); + for (size_t i = 0; i != SledRange.Size; ++i) + SucceedOnce |= patchSled(f[i], Enable, FuncId); atomic_store(&XRayPatching, false, memory_order_release); @@ -365,12 +367,17 @@ // Here we compute the minimum sled and maximum sled associated with a // particular function ID. - auto SledRange = InstrMap.SledsIndex ? InstrMap.SledsIndex[FuncId - 1] - : findFunctionSleds(FuncId, InstrMap); + XRayFunctionSledIndex SledRange; + if (InstrMap.SledsIndex) { + SledRange = {InstrMap.SledsIndex[FuncId - 1].fromPCRelative(), + InstrMap.SledsIndex[FuncId - 1].Size}; + } else { + SledRange = findFunctionSleds(FuncId, InstrMap); + } auto *f = SledRange.Begin; - auto *e = SledRange.End; + auto *e = SledRange.Begin + SledRange.Size; auto *MinSled = f; - auto *MaxSled = (SledRange.End - 1); + auto *MaxSled = e - 1; while (f != e) { if (f->address() < MinSled->address()) MinSled = f; @@ -502,9 +509,9 @@ if (FuncId <= 0 || static_cast(FuncId) > InstrMap.Functions) return 0; - const XRaySledEntry *Sled = InstrMap.SledsIndex - ? InstrMap.SledsIndex[FuncId - 1].Begin - : findFunctionSleds(FuncId, InstrMap).Begin; + const XRaySledEntry *Sled = + InstrMap.SledsIndex ? InstrMap.SledsIndex[FuncId - 1].fromPCRelative() + : findFunctionSleds(FuncId, InstrMap).Begin; return Sled->function() // On PPC, function entries are always aligned to 16 bytes. The beginning of a // sled might be a local entry, which is always +8 based on the global entry. diff --git a/compiler-rt/lib/xray/xray_interface_internal.h b/compiler-rt/lib/xray/xray_interface_internal.h --- a/compiler-rt/lib/xray/xray_interface_internal.h +++ b/compiler-rt/lib/xray/xray_interface_internal.h @@ -59,7 +59,13 @@ struct XRayFunctionSledIndex { const XRaySledEntry *Begin; - const XRaySledEntry *End; + size_t Size; + // For an entry in the xray_fn_idx section, the address is relative to the + // location of the Begin variable. + const XRaySledEntry *fromPCRelative() const { + return reinterpret_cast(uintptr_t(&Begin) + + uintptr_t(Begin)); + } }; } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -4013,8 +4013,8 @@ if (TM.Options.XRayFunctionIndex) FnSledIndex = OutContext.getELFSection( - "xray_fn_idx", ELF::SHT_PROGBITS, Flags | ELF::SHF_WRITE, 0, - GroupName, F.hasComdat(), MCSection::NonUniqueID, LinkedToSym); + "xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(), + MCSection::NonUniqueID, LinkedToSym); } else if (MF->getSubtarget().getTargetTriple().isOSBinFormatMachO()) { InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map", 0, SectionKind::getReadOnlyWithRel()); @@ -4062,8 +4062,19 @@ OutStreamer->switchSection(FnSledIndex); OutStreamer->emitCodeAlignment(Align(2 * WordSizeBytes), &getSubtargetInfo()); - OutStreamer->emitSymbolValue(SledsStart, WordSizeBytes, false); - OutStreamer->emitSymbolValue(SledsEnd, WordSizeBytes, false); + MCSymbol *Dot = Ctx.createTempSymbol(); + OutStreamer->emitLabel(Dot); + OutStreamer->emitValueImpl( + MCBinaryExpr::createSub(MCSymbolRefExpr::create(SledsStart, Ctx), + MCSymbolRefExpr::create(Dot, Ctx), Ctx), + WordSizeBytes); + OutStreamer->emitValueImpl( + MCBinaryExpr::createLShr( + MCBinaryExpr::createSub(MCSymbolRefExpr::create(SledsEnd, Ctx), + MCSymbolRefExpr::create(SledsStart, Ctx), + Ctx), + MCConstantExpr::create(Log2_32(2 * WordSizeBytes), Ctx), Ctx), + WordSizeBytes); OutStreamer->switchSection(PrevSection); } Sleds.clear(); diff --git a/llvm/test/CodeGen/AArch64/xray-attribute-instrumentation.ll b/llvm/test/CodeGen/AArch64/xray-attribute-instrumentation.ll --- a/llvm/test/CodeGen/AArch64/xray-attribute-instrumentation.ll +++ b/llvm/test/CodeGen/AArch64/xray-attribute-instrumentation.ll @@ -50,18 +50,18 @@ ; CHECK-NEXT: nop ; CHECK-NEXT: nop ; CHECK-NEXT: nop -; CHECK-LABEL: Ltmp4: - ret i32 0 -; CHECK-LABEL: Lxray_sled_3: -; CHECK-NEXT: b #32 -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop ; CHECK-LABEL: Ltmp5: + ret i32 0 +; CHECK-LABEL: Lxray_sled_3: +; CHECK-NEXT: b #32 +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-LABEL: Ltmp6: ; CHECK-NEXT: ret } @@ -88,7 +88,7 @@ ; CHECK-NEXT: nop ; CHECK-NEXT: nop ; CHECK-NEXT: nop -; CHECK-LABEL: Ltmp8: +; CHECK-LABEL: Ltmp10: ret i32 0 ; CHECK-LABEL: Lxray_sled_5: ; CHECK-NEXT: b #32 @@ -99,7 +99,7 @@ ; CHECK-NEXT: nop ; CHECK-NEXT: nop ; CHECK-NEXT: nop -; CHECK-LABEL: Ltmp9: +; CHECK-LABEL: Ltmp11: ; CHECK-NEXT: ret } diff --git a/llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll b/llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll --- a/llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll +++ b/llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll @@ -36,9 +36,9 @@ ; CHECK-LINUX: .Ltmp3: ; CHECK-LINUX-NEXT: .xword .Lxray_sled_1-.Ltmp3 ; CHECK-LINUX-LABEL: Lxray_sleds_end0: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,callee{{$}} +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,callee{{$}} ; CHECK-LINUX: .xword .Lxray_sleds_start0 -; CHECK-LINUX-NEXT: .xword .Lxray_sleds_end0 +; CHECK-LINUX-NEXT: .xword (.Lxray_sleds_end0-.Lxray_sleds_start0)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start0: @@ -48,8 +48,9 @@ ; CHECK-MACOS-NEXT: .quad Lxray_sled_1-Ltmp3 ; CHECK-MACOS-LABEL: Lxray_sleds_end0: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start0 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end0 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start0-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end0-Lxray_sleds_start0)>>4 define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" { ; CHECK: .p2align 2 @@ -62,18 +63,18 @@ ; CHECK-NEXT: nop ; CHECK-NEXT: nop ; CHECK-NEXT: nop -; CHECK-LABEL: Ltmp4: -; CHECK: .p2align 2 -; CHECK-LABEL: Lxray_sled_3: -; CHECK-NEXT: b #32 -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop -; CHECK-NEXT: nop ; CHECK-LABEL: Ltmp5: +; CHECK: .p2align 2 +; CHECK-LABEL: Lxray_sled_3: +; CHECK-NEXT: b #32 +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-NEXT: nop +; CHECK-LABEL: Ltmp6: %retval = tail call i32 @callee() ; CHECK-LINUX: b callee ; CHECK-MACOS: b _callee @@ -85,9 +86,10 @@ ; CHECK-LINUX: .xword .Lxray_sled_2 ; CHECK-LINUX: .xword .Lxray_sled_3 ; CHECK-LINUX-LABEL: Lxray_sleds_end1: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,caller{{$}} -; CHECK-LINUX: .xword .Lxray_sleds_start1 -; CHECK-LINUX-NEXT: .xword .Lxray_sleds_end1 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,caller{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .xword .Lxray_sleds_start1-[[TMP]] +; CHECK-LINUX-NEXT: .xword (.Lxray_sleds_end1-.Lxray_sleds_start1)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start1: @@ -95,5 +97,6 @@ ; CHECK-MACOS: .quad Lxray_sled_3 ; CHECK-MACOS-LABEL: Lxray_sleds_end1: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start1 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end1 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start1-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end1-Lxray_sleds_start1)>>4 diff --git a/llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll b/llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll --- a/llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll +++ b/llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll @@ -40,8 +40,9 @@ ; CHECK-NEXT: .byte 0x02 ; CHECK-NEXT: .space 13 ; CHECK-NEXT: .Lxray_sleds_end0: -; CHECK-LABEL: xray_fn_idx,"awo",@progbits,foo{{$}} +; CHECK-LABEL: xray_fn_idx,"ao",@progbits,foo{{$}} ; CHECK: .p2align 4 -; CHECK-NEXT: .quad .Lxray_sleds_start0 -; CHECK-NEXT: .quad .Lxray_sleds_end0 +; CHECK-NEXT: [[TMP:.Ltmp[0-9]+]]: +; CHECK-NEXT: .quad .Lxray_sleds_start0-[[TMP]] +; CHECK-NEXT: .quad (.Lxray_sleds_end0-.Lxray_sleds_start0)>>4 ; CHECK-NEXT: .text diff --git a/llvm/test/CodeGen/PowerPC/xray-tail-call-sled.ll b/llvm/test/CodeGen/PowerPC/xray-tail-call-sled.ll --- a/llvm/test/CodeGen/PowerPC/xray-tail-call-sled.ll +++ b/llvm/test/CodeGen/PowerPC/xray-tail-call-sled.ll @@ -22,18 +22,18 @@ } define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" { -; CHECK-LABEL: .Ltmp5: -; CHECK-NEXT: b .Ltmp6 -; CHECK-NEXT: nop -; CHECK-NEXT: std 0, -8(1) -; CHECK-NEXT: mflr 0 -; CHECK-NEXT: bl __xray_FunctionEntry -; CHECK-NEXT: nop -; CHECK-NEXT: mtlr 0 ; CHECK-LABEL: .Ltmp6: +; CHECK-NEXT: b .Ltmp7 +; CHECK-NEXT: nop +; CHECK-NEXT: std 0, -8(1) +; CHECK-NEXT: mflr 0 +; CHECK-NEXT: bl __xray_FunctionEntry +; CHECK-NEXT: nop +; CHECK-NEXT: mtlr 0 +; CHECK-LABEL: .Ltmp7: %retval = tail call i32 @callee() ret i32 %retval -; CHECK-LABEL: .Ltmp7: +; CHECK-LABEL: .Ltmp8: ; CHECK: blr ; CHECK-NEXT: nop ; CHECK-NEXT: std 0, -8(1) diff --git a/llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll b/llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll --- a/llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll +++ b/llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll @@ -19,9 +19,10 @@ ; CHECK-LINUX: .quad .Lxray_sled_0 ; CHECK-LINUX: .quad .Lxray_sled_1 ; CHECK-LINUX-LABEL: .Lxray_sleds_end0: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,foo{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start0 -; CHECK-LINUX-NEXT: .quad .Lxray_sleds_end0 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,foo{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start0-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end0-.Lxray_sleds_start0)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start0: @@ -29,8 +30,9 @@ ; CHECK-MACOS: .quad Lxray_sled_1 ; CHECK-MACOS-LABEL: Lxray_sleds_end0: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start0 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end0 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start0-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end0-Lxray_sleds_start0)>>4 ; We test multiple returns in a single function to make sure we're getting all @@ -59,26 +61,28 @@ ; CHECK-LINUX-LABEL: .section xray_instr_map,"ao",@progbits,bar{{$}} ; CHECK-LINUX-LABEL: .Lxray_sleds_start1: -; CHECK-LINUX: .Ltmp2: -; CHECK-LINUX-NEXT: .quad .Lxray_sled_2-.Ltmp2 -; CHECK-LINUX: .Ltmp3: -; CHECK-LINUX-NEXT: .quad .Lxray_sled_3-.Ltmp3 -; CHECK-LINUX: .Ltmp4: -; CHECK-LINUX-NEXT: .quad .Lxray_sled_4-.Ltmp4 +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sled_2-[[TMP]] +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sled_3-[[TMP]] +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sled_4-[[TMP]] ; CHECK-LINUX-LABEL: .Lxray_sleds_end1: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,bar{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start1 -; CHECK-LINUX-NEXT: .quad .Lxray_sleds_end1 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,bar{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start1-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end1-.Lxray_sleds_start1)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start1: -; CHECK-MACOS: Ltmp2: -; CHECK-MACOS-NEXT: .quad Lxray_sled_2-Ltmp2 -; CHECK-MACOS: Ltmp3: -; CHECK-MACOS-NEXT: .quad Lxray_sled_3-Ltmp3 -; CHECK-MACOS: Ltmp4: -; CHECK-MACOS-NEXT: .quad Lxray_sled_4-Ltmp4 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sled_2-[[TMP]] +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sled_3-[[TMP]] +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sled_4-[[TMP]] ; CHECK-MACOS-LABEL: Lxray_sleds_end1: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start1 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end1 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start1-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end1-Lxray_sleds_start1)>>4 diff --git a/llvm/test/CodeGen/X86/xray-log-args.ll b/llvm/test/CodeGen/X86/xray-log-args.ll --- a/llvm/test/CodeGen/X86/xray-log-args.ll +++ b/llvm/test/CodeGen/X86/xray-log-args.ll @@ -47,32 +47,32 @@ } ; CHECK-LINUX-LABEL: .Lxray_sleds_start1: -; CHECK-LINUX-NEXT: .Ltmp3: -; CHECK-LINUX-NEXT: .quad .Lxray_sled_2-.Ltmp3 -; CHECK-LINUX-NEXT: .quad .Lfunc_begin1-(.Ltmp3+8) -; CHECK-LINUX-NEXT: .byte 0x03 -; CHECK-LINUX-NEXT: .byte 0x01 -; CHECK-LINUX-NEXT: .byte 0x02 -; CHECK-LINUX: .zero 13 -; CHECK-LINUX: .Ltmp4: -; CHECK-LINUX-NEXT: .quad .Lxray_sled_3-.Ltmp4 +; CHECK-LINUX-NEXT: .Ltmp4: +; CHECK-LINUX-NEXT: .quad .Lxray_sled_2-.Ltmp4 ; CHECK-LINUX-NEXT: .quad .Lfunc_begin1-(.Ltmp4+8) +; CHECK-LINUX-NEXT: .byte 0x03 +; CHECK-LINUX-NEXT: .byte 0x01 +; CHECK-LINUX-NEXT: .byte 0x02 +; CHECK-LINUX: .zero 13 +; CHECK-LINUX: .Ltmp5: +; CHECK-LINUX-NEXT: .quad .Lxray_sled_3-.Ltmp5 +; CHECK-LINUX-NEXT: .quad .Lfunc_begin1-(.Ltmp5+8) ; CHECK-LINUX-NEXT: .byte 0x02 ; CHECK-LINUX-NEXT: .byte 0x01 ; CHECK-LINUX-NEXT: .byte 0x02 ; CHECK-LINUX: .zero 13 ; CHECK-MACOS-LABEL: Lxray_sleds_start1: -; CHECK-MACOS-NEXT: Ltmp3: -; CHECK-MACOS-NEXT: .quad Lxray_sled_2-Ltmp3 -; CHECK-MACOS-NEXT: .quad Lfunc_begin1-(Ltmp3+8) -; CHECK-MACOS-NEXT: .byte 0x03 -; CHECK-MACOS-NEXT: .byte 0x01 -; CHECK-MACOS-NEXT: .byte 0x02 -; CHECK-MACOS: .space 13 -; CHECK-MACOS: Ltmp4: -; CHECK-MACOS-NEXT: .quad Lxray_sled_3-Ltmp4 +; CHECK-MACOS-NEXT: Ltmp4: +; CHECK-MACOS-NEXT: .quad Lxray_sled_2-Ltmp4 ; CHECK-MACOS-NEXT: .quad Lfunc_begin1-(Ltmp4+8) +; CHECK-MACOS-NEXT: .byte 0x03 +; CHECK-MACOS-NEXT: .byte 0x01 +; CHECK-MACOS-NEXT: .byte 0x02 +; CHECK-MACOS: .space 13 +; CHECK-MACOS: Ltmp5: +; CHECK-MACOS-NEXT: .quad Lxray_sled_3-Ltmp5 +; CHECK-MACOS-NEXT: .quad Lfunc_begin1-(Ltmp5+8) ; CHECK-MACOS-NEXT: .byte 0x02 ; CHECK-MACOS-NEXT: .byte 0x01 ; CHECK-MACOS-NEXT: .byte 0x02 diff --git a/llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll b/llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll --- a/llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll +++ b/llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll @@ -15,17 +15,19 @@ ; CHECK-LINUX-LABEL: .Lxray_sleds_start0: ; CHECK-LINUX: .quad .Lxray_sled_0 ; CHECK-LINUX-LABEL: .Lxray_sleds_end0: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,foo{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start0 -; CHECK-LINUX-NEXT: .quad .Lxray_sleds_end0 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,foo{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start0-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end0-.Lxray_sleds_start0)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start0: ; CHECK-MACOS: .quad Lxray_sled_0 ; CHECK-MACOS-LABEL: Lxray_sleds_end0: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start0 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end0 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start0-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end0-Lxray_sleds_start0)>>4 ; We test multiple returns in a single function to make sure we're getting all @@ -54,9 +56,10 @@ ; CHECK-LINUX: .quad .Lxray_sled_1 ; CHECK-LINUX: .quad .Lxray_sled_2 ; CHECK-LINUX-LABEL: .Lxray_sleds_end1: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,bar{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start1 -; CHECK-LINUX-NEXT: .quad .Lxray_sleds_end1 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,bar{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start1-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end1-.Lxray_sleds_start1)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start1: @@ -64,5 +67,6 @@ ; CHECK-MACOS: .quad Lxray_sled_2 ; CHECK-MACOS-LABEL: Lxray_sleds_end1: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start1 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end1 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start1-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end1-Lxray_sleds_start1)>>4 diff --git a/llvm/test/CodeGen/X86/xray-tail-call-sled.ll b/llvm/test/CodeGen/X86/xray-tail-call-sled.ll --- a/llvm/test/CodeGen/X86/xray-tail-call-sled.ll +++ b/llvm/test/CodeGen/X86/xray-tail-call-sled.ll @@ -18,9 +18,10 @@ ; CHECK-LINUX: .quad .Lxray_sled_0 ; CHECK-LINUX: .quad .Lxray_sled_1 ; CHECK-LINUX-LABEL: .Lxray_sleds_end0: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,callee{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start0 -; CHECK-LINUX-NEXT: .quad .Lxray_sleds_end0 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,callee{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start0-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end0-.Lxray_sleds_start0)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start0: @@ -28,8 +29,9 @@ ; CHECK-MACOS: .quad Lxray_sled_1 ; CHECK-MACOS-LABEL: Lxray_sleds_end0: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start0 -; CHECK-MACOS-NEXT: .quad Lxray_sleds_end0 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start0-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end0-Lxray_sleds_start0)>>4 define dso_local i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" { ; CHECK: .p2align 1, 0x90 @@ -50,9 +52,10 @@ ; CHECK-LINUX: .quad .Lxray_sled_2 ; CHECK-LINUX: .quad .Lxray_sled_3 ; CHECK-LINUX-LABEL: .Lxray_sleds_end1: -; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,caller{{$}} -; CHECK-LINUX: .quad .Lxray_sleds_start1 -; CHECK-LINUX: .quad .Lxray_sleds_end1 +; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",@progbits,caller{{$}} +; CHECK-LINUX: [[TMP:.Ltmp[0-9]+]]: +; CHECK-LINUX-NEXT: .quad .Lxray_sleds_start1-[[TMP]] +; CHECK-LINUX-NEXT: .quad (.Lxray_sleds_end1-.Lxray_sleds_start1)>>4 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map{{$}} ; CHECK-MACOS-LABEL: Lxray_sleds_start1: @@ -60,5 +63,6 @@ ; CHECK-MACOS: .quad Lxray_sled_3 ; CHECK-MACOS-LABEL: Lxray_sleds_end1: ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx{{$}} -; CHECK-MACOS: .quad Lxray_sleds_start1 -; CHECK-MACOS: .quad Lxray_sleds_end1 +; CHECK-MACOS: [[TMP:Ltmp[0-9]+]]: +; CHECK-MACOS-NEXT: .quad Lxray_sleds_start1-[[TMP]] +; CHECK-MACOS-NEXT: .quad (Lxray_sleds_end1-Lxray_sleds_start1)>>4