MaskRay updated this revision to Diff 533131.
MaskRay edited the summary of this revision.
MaskRay added a comment.
Herald added subscribers: cfe-commits, arphaman.
Herald added a project: clang.

fix clang/test/CodeGen/xray-function-index.c


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152661/new/

https://reviews.llvm.org/D152661

Files:
  clang/test/CodeGen/xray-function-index.c
  compiler-rt/lib/xray/xray_interface.cpp
  compiler-rt/lib/xray/xray_interface_internal.h
  llvm/include/llvm/MC/MCContext.h
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/MC/MCContext.cpp
  llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll
  llvm/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
  llvm/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
  llvm/test/CodeGen/Hexagon/xray.ll
  llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll
  llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll
  llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll
  llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-exit.ll
  llvm/test/CodeGen/X86/xray-tail-call-sled.ll
  llvm/test/DebugInfo/X86/xray-split-dwarf-interaction.ll

Index: llvm/test/DebugInfo/X86/xray-split-dwarf-interaction.ll
===================================================================
--- llvm/test/DebugInfo/X86/xray-split-dwarf-interaction.ll
+++ llvm/test/DebugInfo/X86/xray-split-dwarf-interaction.ll
@@ -25,7 +25,7 @@
 ; `a::b()` is actually associated with the function's symbol instead of the
 ; .debug_types.dwo section.
 ;
-; CHECK-ASM: xray_fn_idx,"awo",@progbits,_ZN1a1bEv{{$}}
+; CHECK-ASM: xray_fn_idx,"ao",@progbits,_ZN1a1bEv{{$}}
 ;
 ; CHECK-ELF-DAG: [[FSECT:[0-9]+]]] .text._ZN1a1bEv PROGBITS
 ; CHECK-ELF-DAG: [{{.*}}] .debug_types.dwo PROGBITS
Index: llvm/test/CodeGen/X86/xray-tail-call-sled.ll
===================================================================
--- llvm/test/CodeGen/X86/xray-tail-call-sled.ll
+++ 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start0-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; 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,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start0
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end0
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start0-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
 
 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start1-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; 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,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start1
-; CHECK-MACOS:         .quad Lxray_sleds_end1
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start1-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
Index: llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-exit.ll
===================================================================
--- llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-exit.ll
+++ llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-exit.ll
@@ -55,7 +55,8 @@
 ; CHECK-LINUX:         .quad .Lxray_sled_1
 ; CHECK-LINUX-LABEL: .Lxray_sleds_end1:
 ; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",@progbits,bar{[$}}
-; CHECK-LINUX:         .quad .Lxray_sleds_start1
+; CHECK-LINUX:       .Lxray_fn_idx0:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start1-.Lxray_fn_idx0
 ; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_end1
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
@@ -63,5 +64,6 @@
 ; CHECK-MACOS:         .quad Lxray_sled_1
 ; CHECK-MACOS-LABEL: Lxray_sleds_end1:
 ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start1
+; CHECK-MACOS:       Lxray_fn_idx0:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start1-Lxray_fn_idx0
 ; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end1
Index: llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll
===================================================================
--- llvm/test/CodeGen/X86/xray-partial-instrumentation-skip-entry.ll
+++ 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start0-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 1
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; 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,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start0
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end0
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start0-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 1
 
 
 ; 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start1-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; 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,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start1
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end1
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start1-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
Index: llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll
===================================================================
--- llvm/test/CodeGen/X86/xray-attribute-instrumentation.ll
+++ 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start0-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; 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,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start0
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end0
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start0-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
 
 
 ; We test multiple returns in a single function to make sure we're getting all
@@ -66,9 +68,10 @@
 ; 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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .quad .Lxray_sleds_start1-[[IDX]]
+; CHECK-LINUX-NEXT:    .quad 3
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; CHECK-MACOS-LABEL: Lxray_sleds_start1:
@@ -80,5 +83,6 @@
 ; CHECK-MACOS-NEXT:    .quad Lxray_sled_4-[[TMP]]
 ; CHECK-MACOS-LABEL: Lxray_sleds_end1:
 ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start1
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end1
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start1-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 3
Index: llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/xray-attribute-instrumentation.ll
+++ 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: [[IDX:.Lxray_fn_idx[0-9]+]]:
+; CHECK-NEXT:         .quad .Lxray_sleds_start0-[[IDX]]
+; CHECK-NEXT:         .quad 2
 ; CHECK-NEXT:         .text
Index: llvm/test/CodeGen/Hexagon/xray.ll
===================================================================
--- llvm/test/CodeGen/Hexagon/xray.ll
+++ llvm/test/CodeGen/Hexagon/xray.ll
@@ -32,5 +32,5 @@
 ; CHECK-NEXT:  .space 5
 ; CHECK-LABEL: .Lxray_sleds_end0:
 ; CHECK-LABEL: xray_fn_idx
-; CHECK:       .word .Lxray_sleds_start0{{$}}
-; CHECK-NEXT:  .word .Lxray_sleds_end0{{$}}
+; CHECK:       .word .Lxray_sleds_start0-.Lxray_fn_idx[[#]]
+; CHECK-NEXT:  .word 2
Index: llvm/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
===================================================================
--- llvm/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
+++ llvm/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
@@ -19,9 +19,10 @@
 ; CHECK-LINUX:         .long .Lxray_sled_0
 ; CHECK-LINUX:         .long .Lxray_sled_1
 ; CHECK-LINUX-LABEL: .Lxray_sleds_end0:
-; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",%progbits,foo{{$}}
-; CHECK-LINUX:         .long .Lxray_sleds_start0
-; CHECK-LINUX-NEXT:    .long .Lxray_sleds_end0
+; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",%progbits,foo{{$}}
+; CHECK-LINUX:       .Lxray_fn_idx0:
+; CHECK-LINUX-NEXT:    .long .Lxray_sleds_start0-.Lxray_fn_idx0
+; CHECK-LINUX-NEXT:    .long 2
 
 ; CHECK-IOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; CHECK-IOS-LABEL: Lxray_sleds_start0:
@@ -29,5 +30,6 @@
 ; CHECK-IOS:         .long Lxray_sled_1
 ; CHECK-IOS-LABEL: Lxray_sleds_end0:
 ; CHECK-IOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-IOS:         .long Lxray_sleds_start0
-; CHECK-IOS-NEXT:    .long Lxray_sleds_end0
+; CHECK-IOS:       lxray_fn_idx0:
+; CHECK-IOS:         .long Lxray_sleds_start0-lxray_fn_idx0
+; CHECK-IOS-NEXT:    .long 2
Index: llvm/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
===================================================================
--- llvm/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
+++ llvm/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
@@ -29,9 +29,9 @@
 ; CHECK-LINUX:         .long .Lxray_sled_0
 ; CHECK-LINUX:         .long .Lxray_sled_1
 ; CHECK-LINUX-LABEL: .Lxray_sleds_end0:
-; CHECK-LINUX-LABEL: .section xray_fn_idx,"awo",%progbits,foo{{$}}
-; CHECK-LINUX:         .long .Lxray_sleds_start0
-; CHECK-LINUX-NEXT:    .long .Lxray_sleds_end0
+; CHECK-LINUX-LABEL: .section xray_fn_idx,"ao",%progbits,foo{{$}}
+; CHECK-LINUX:         .long .Lxray_sleds_start0-.Lxray_fn_idx0
+; CHECK-LINUX-NEXT:    .long 2
 
 ; CHECK-IOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; CHECK-IOS-LABEL: Lxray_sleds_start0:
@@ -39,5 +39,5 @@
 ; CHECK-IOS:         .long Lxray_sled_1
 ; CHECK-IOS-LABEL: Lxray_sleds_end0:
 ; CHECK-IOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-IOS:         .long Lxray_sleds_start0
-; CHECK-IOS-NEXT:    .long Lxray_sleds_end0
+; CHECK-IOS:         .long Lxray_sleds_start0-lxray_fn_idx0
+; CHECK-IOS-NEXT:    .long 2
Index: llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll
===================================================================
--- llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll
+++ llvm/test/CodeGen/AArch64/xray-tail-call-sled.ll
@@ -24,9 +24,9 @@
 ; CHECK-LINUX:       [[TMP:.Ltmp[0-9]+]]:
 ; CHECK-LINUX-NEXT:    .xword .Lxray_sled_1-[[TMP]]
 ; 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 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; CHECK-MACOS-LABEL: Lxray_sleds_start0:
@@ -36,8 +36,9 @@
 ; CHECK-MACOS-NEXT:    .quad Lxray_sled_1-[[TMP]]
 ; CHECK-MACOS-LABEL: Lxray_sleds_end0:
 ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start0
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end0
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start0-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
 
 define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" {
 ; CHECK:       .p2align	2
@@ -61,9 +62,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:       [[IDX:\.Lxray_fn_idx[0-9]+]]:
+; CHECK-LINUX-NEXT:    .xword .Lxray_sleds_start1-[[IDX]]
+; CHECK-LINUX-NEXT:    .xword 2
 
 ; CHECK-MACOS-LABEL: .section __DATA,xray_instr_map,regular,live_support{{$}}
 ; CHECK-MACOS-LABEL: Lxray_sleds_start1:
@@ -71,5 +73,6 @@
 ; CHECK-MACOS:         .quad Lxray_sled_3
 ; CHECK-MACOS-LABEL: Lxray_sleds_end1:
 ; CHECK-MACOS-LABEL: .section __DATA,xray_fn_idx,regular,live_support{{$}}
-; CHECK-MACOS:         .quad Lxray_sleds_start1
-; CHECK-MACOS-NEXT:    .quad Lxray_sleds_end1
+; CHECK-MACOS:       [[IDX:lxray_fn_idx[0-9]+]]:
+; CHECK-MACOS-NEXT:    .quad Lxray_sleds_start1-[[IDX]]
+; CHECK-MACOS-NEXT:    .quad 2
Index: llvm/lib/MC/MCContext.cpp
===================================================================
--- llvm/lib/MC/MCContext.cpp
+++ llvm/lib/MC/MCContext.cpp
@@ -310,8 +310,12 @@
 }
 
 MCSymbol *MCContext::createLinkerPrivateTempSymbol() {
+  return createLinkerPrivateTempSymbol("tmp");
+}
+
+MCSymbol *MCContext::createLinkerPrivateTempSymbol(const Twine &Name) {
   SmallString<128> NameSV;
-  raw_svector_ostream(NameSV) << MAI->getLinkerPrivateGlobalPrefix() << "tmp";
+  raw_svector_ostream(NameSV) << MAI->getLinkerPrivateGlobalPrefix() << Name;
   return createSymbol(NameSV, true, false);
 }
 
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ 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",
                                          MachO::S_ATTR_LIVE_SUPPORT,
@@ -4022,7 +4022,7 @@
     if (TM.Options.XRayFunctionIndex)
       FnSledIndex = OutContext.getMachOSection(
           "__DATA", "xray_fn_idx", MachO::S_ATTR_LIVE_SUPPORT,
-          SectionKind::getReadOnlyWithRel());
+          SectionKind::getReadOnly());
   } else {
     llvm_unreachable("Unsupported target");
   }
@@ -4064,8 +4064,17 @@
     OutStreamer->switchSection(FnSledIndex);
     OutStreamer->emitCodeAlignment(Align(2 * WordSizeBytes),
                                    &getSubtargetInfo());
-    OutStreamer->emitSymbolValue(SledsStart, WordSizeBytes, false);
-    OutStreamer->emitSymbolValue(SledsEnd, WordSizeBytes, false);
+    // For Mach-O, use an "l" symbol as the atom of this subsection. The label
+    // difference uses a SUBTRACTOR external relocation which references the
+    // symbol.
+    MCSymbol *Dot = Ctx.createLinkerPrivateTempSymbol("xray_fn_idx");
+    OutStreamer->emitLabel(Dot);
+    OutStreamer->emitValueImpl(
+        MCBinaryExpr::createSub(MCSymbolRefExpr::create(SledsStart, Ctx),
+                                MCSymbolRefExpr::create(Dot, Ctx), Ctx),
+        WordSizeBytes);
+    OutStreamer->emitValueImpl(MCConstantExpr::create(Sleds.size(), Ctx),
+                               WordSizeBytes);
     OutStreamer->switchSection(PrevSection);
   }
   Sleds.clear();
Index: llvm/include/llvm/MC/MCContext.h
===================================================================
--- llvm/include/llvm/MC/MCContext.h
+++ llvm/include/llvm/MC/MCContext.h
@@ -476,6 +476,7 @@
   /// Create and return a new linker temporary symbol with a unique but
   /// unspecified name.
   MCSymbol *createLinkerPrivateTempSymbol();
+  MCSymbol *createLinkerPrivateTempSymbol(const Twine &Name);
 
   /// Create a temporary symbol with a unique name. The name will be omitted
   /// in the symbol table if UseNamesOnTempLabels is false (default except
Index: compiler-rt/lib/xray/xray_interface_internal.h
===================================================================
--- compiler-rt/lib/xray/xray_interface_internal.h
+++ 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<const XRaySledEntry *>(uintptr_t(&Begin) +
+                                                   uintptr_t(Begin));
+  }
 };
 }
 
Index: compiler-rt/lib/xray/xray_interface.cpp
===================================================================
--- compiler-rt/lib/xray/xray_interface.cpp
+++ 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<size_t>(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.
Index: clang/test/CodeGen/xray-function-index.c
===================================================================
--- clang/test/CodeGen/xray-function-index.c
+++ clang/test/CodeGen/xray-function-index.c
@@ -2,7 +2,7 @@
 // RUN: %clang_cc1 -S -triple x86_64 -fxray-instrument -fxray-instruction-threshold=1 %s -o - | FileCheck %s
 // RUN: %clang_cc1 -S -triple x86_64 -fxray-instrument -fxray-instruction-threshold=1 -fno-xray-function-index %s -o - | FileCheck %s --check-prefix=NO
 
-// CHECK: .section xray_fn_idx,"awo",@progbits,foo
+// CHECK: .section xray_fn_idx,"ao",@progbits,foo
 // NO-NOT: .section xray_fn_idx
 
 void foo(void) {}
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to