Index: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2801,26 +2801,24 @@ } // Before we switch over, we force a reference to a label inside the - // xray_instr_map and xray_fn_idx sections. Since this function is always - // called just before the function's end, we assume that this is happening - // after the last return instruction. We also use the synthetic label in the - // xray_inster_map as a delimeter for the range of sleds for this function in - // the index. + // xray_fn_idx sections. This makes sure that the xray_fn_idx section is kept + // live by the linker if the function is not garbage-collected. Since this + // function is always called just before the function's end, we assume that + // this is happening after the last return instruction. auto WordSizeBytes = MAI->getCodePointerSize(); - MCSymbol *SledsStart = OutContext.createTempSymbol("xray_synthetic_", true); MCSymbol *IdxRef = OutContext.createTempSymbol("xray_fn_idx_synth_", true); OutStreamer->EmitCodeAlignment(16); - OutStreamer->EmitSymbolValue(SledsStart, WordSizeBytes, false); OutStreamer->EmitSymbolValue(IdxRef, WordSizeBytes, false); // Now we switch to the instrumentation map section. Because this is done // per-function, we are able to create an index entry that will represent the // range of sleds associated with a function. + MCSymbol *SledsStart = OutContext.createTempSymbol("xray_sleds_start", true); OutStreamer->SwitchSection(InstMap); OutStreamer->EmitLabel(SledsStart); for (const auto &Sled : Sleds) Sled.emit(WordSizeBytes, OutStreamer.get(), CurrentFnSym); - MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_synthetic_end", true); + MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true); OutStreamer->EmitLabel(SledsEnd); // We then emit a single entry in the index per function. We use the symbols Index: llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll +++ llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll @@ -25,9 +25,9 @@ ; CHECK-NEXT: ret } ; CHECK: .p2align 4 -; CHECK-NEXT: .xword .Lxray_synthetic_0 ; CHECK-NEXT: .xword .Lxray_fn_idx_synth_0 ; CHECK-NEXT: .section xray_instr_map,{{.*}} -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0 ; CHECK: .xword .Lxray_sled_0 ; CHECK: .xword .Lxray_sled_1 +; CHECK-LABEL: Lxray_sleds_end0 Index: llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll +++ llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll @@ -28,21 +28,20 @@ ; CHECK-NEXT: ret } ; CHECK: .p2align 4 -; CHECK-NEXT: .xword .Lxray_synthetic_0 ; CHECK-NEXT: .xword .Lxray_fn_idx_synth_0 ; CHECK-NEXT: .section xray_instr_map,{{.*}} -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .xword .Lxray_sled_0 ; CHECK: .xword .Lxray_sled_1 -; CHECK-LABEL: Lxray_synthetic_end0: +; CHECK-LABEL: Lxray_sleds_end0: ; CHECK: .section xray_fn_idx,{{.*}} ; CHECK-LABEL: Lxray_fn_idx_synth_0: -; CHECK: .xword .Lxray_synthetic_0 -; CHECK-NEXT: .xword .Lxray_synthetic_end0 +; CHECK: .xword .Lxray_sleds_start0 +; CHECK-NEXT: .xword .Lxray_sleds_end0 define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" { ; CHECK: .p2align 2 -; CHECK-LABEL: .Lxray_sled_2: +; CHECK-LABEL: Lxray_sled_2: ; CHECK-NEXT: b #32 ; CHECK-NEXT: nop ; CHECK-NEXT: nop @@ -53,7 +52,7 @@ ; CHECK-NEXT: nop ; CHECK-LABEL: .Ltmp2: ; CHECK: .p2align 2 -; CHECK-LABEL: .Lxray_sled_3: +; CHECK-LABEL: Lxray_sled_3: ; CHECK-NEXT: b #32 ; CHECK-NEXT: nop ; CHECK-NEXT: nop @@ -68,14 +67,13 @@ ret i32 %retval } ; CHECK: .p2align 4 -; CHECK-NEXT: .xword .Lxray_synthetic_1 ; CHECK-NEXT: .xword .Lxray_fn_idx_synth_1 ; CHECK-NEXT: .section xray_instr_map,{{.*}} -; CHECK-LABEL: Lxray_synthetic_1: +; CHECK-LABEL: Lxray_sleds_start1: ; CHECK: .xword .Lxray_sled_2 ; CHECK: .xword .Lxray_sled_3 -; CHECK-LABEL: Lxray_synthetic_end1: +; CHECK-LABEL: Lxray_sleds_end1: ; CHECK: .section xray_fn_idx,{{.*}} ; CHECK-LABEL: Lxray_fn_idx_synth_1: -; CHECK: .xword .Lxray_synthetic_1 -; CHECK-NEXT: .xword .Lxray_synthetic_end1 +; CHECK: .xword .Lxray_sleds_start1 +; CHECK-NEXT: .xword .Lxray_sleds_end1 Index: llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll +++ llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll @@ -24,14 +24,13 @@ ; CHECK-NEXT: bx lr } ; CHECK: .p2align 4 -; CHECK-NEXT: .long {{.*}}Lxray_synthetic_0 ; CHECK-NEXT: .long {{.*}}Lxray_fn_idx_synth_0 ; CHECK-NEXT: .section {{.*}}xray_instr_map{{.*}} -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .long {{.*}}Lxray_sled_0 ; CHECK: .long {{.*}}Lxray_sled_1 -; CHECK-LABEL: Lxray_synthetic_end0: +; CHECK-LABEL: Lxray_sleds_end0: ; CHECK: .section {{.*}}xray_fn_idx{{.*}} ; CHECK-LABEL: Lxray_fn_idx_synth_0: -; CHECK: .long {{.*}}Lxray_synthetic_0 -; CHECK-NEXT: .long {{.*}}Lxray_synthetic_end0 +; CHECK: .long {{.*}}Lxray_sleds_start0 +; CHECK-NEXT: .long {{.*}}Lxray_sleds_end0 Index: llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll +++ llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll @@ -24,15 +24,14 @@ ; CHECK-NEXT: bx lr } ; CHECK: .p2align 4 -; CHECK-NEXT: .long {{.*}}Lxray_synthetic_0 ; CHECK-NEXT: .long {{.*}}Lxray_fn_idx_synth_0 ; CHECK-NEXT: .section {{.*}}xray_instr_map{{.*}} -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .long {{.*}}Lxray_sled_0 ; CHECK: .long {{.*}}Lxray_sled_1 -; CHECK-LABEL: Lxray_synthetic_end0: +; CHECK-LABEL: Lxray_sleds_end0: ; CHECK: .section {{.*}}xray_fn_idx{{.*}} ; CHECK-LABEL: Lxray_fn_idx_synth_0: -; CHECK: .long {{.*}}xray_synthetic_0 -; CHECK-NEXT: .long {{.*}}xray_synthetic_end0 +; CHECK: .long {{.*}}xray_sleds_start0 +; CHECK-NEXT: .long {{.*}}xray_sleds_end0 Index: llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll +++ llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll @@ -14,17 +14,16 @@ ; CHECK-NEXT: nopw %cs:512(%rax,%rax) } ; CHECK: .p2align 4, 0x90 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_0 ; CHECK-NEXT: .quad {{.*}}xray_fn_idx_synth_0 ; CHECK-NEXT: .section {{.*}}xray_instr_map -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .quad {{.*}}xray_sled_0 ; CHECK: .quad {{.*}}xray_sled_1 -; CHECK-LABEL: Lxray_synthetic_end0: +; CHECK-LABEL: Lxray_sleds_end0: ; CHECK: .section {{.*}}xray_fn_idx ; CHECK-LABEL: Lxray_fn_idx_synth_0: -; CHECK: .quad {{.*}}xray_synthetic_0 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_end0 +; CHECK: .quad {{.*}}xray_sleds_start0 +; CHECK-NEXT: .quad {{.*}}xray_sleds_end0 ; We test multiple returns in a single function to make sure we're getting all @@ -52,15 +51,14 @@ ; CHECK-NEXT: nopw %cs:512(%rax,%rax) } ; CHECK: .p2align 4, 0x90 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_1 ; CHECK-NEXT: .quad {{.*}}xray_fn_idx_synth_1 ; CHECK-NEXT: .section {{.*}}xray_instr_map -; CHECK-LABEL: Lxray_synthetic_1: +; CHECK-LABEL: Lxray_sleds_start1: ; CHECK: .quad {{.*}}xray_sled_2 ; CHECK: .quad {{.*}}xray_sled_3 ; CHECK: .quad {{.*}}xray_sled_4 -; CHECK-LABEL: Lxray_synthetic_end1: +; CHECK-LABEL: Lxray_sleds_end1: ; CHECK: .section {{.*}}xray_fn_idx ; CHECK-LABEL: Lxray_fn_idx_synth_1: -; CHECK: .quad {{.*}}xray_synthetic_1 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_end1 +; CHECK: .quad {{.*}}xray_sleds_start1 +; CHECK-NEXT: .quad {{.*}}xray_sleds_end1 Index: llvm/trunk/test/CodeGen/X86/xray-custom-log.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/xray-custom-log.ll +++ llvm/trunk/test/CodeGen/X86/xray-custom-log.ll @@ -17,7 +17,7 @@ ret i32 0 } ; CHECK: .section {{.*}}xray_instr_map -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .quad {{.*}}xray_event_sled_0 declare void @llvm.xray.customevent(i8*, i32) Index: llvm/trunk/test/CodeGen/X86/xray-log-args.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/xray-log-args.ll +++ llvm/trunk/test/CodeGen/X86/xray-log-args.ll @@ -6,7 +6,7 @@ define i32 @callee(i32 %arg) nounwind noinline uwtable "function-instrument"="xray-always" "xray-log-args"="1" { ret i32 %arg } -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .quad {{\.?}}Lxray_sled_0 ; CHECK: .quad {{_?}}callee ; CHECK: .byte 3 @@ -22,7 +22,7 @@ %retval = tail call i32 @callee(i32 %arg) ret i32 %retval } -; CHECK-LABEL: Lxray_synthetic_1: +; CHECK-LABEL: Lxray_sleds_start1: ; CHECK: .quad {{\.?}}Lxray_sled_2 ; CHECK: .quad {{_?}}caller ; CHECK: .byte 3 Index: llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll +++ llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll @@ -14,17 +14,16 @@ ; CHECK-NEXT: nopw %cs:512(%rax,%rax) } ; CHECK: .p2align 4, 0x90 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_0{{.*}} ; CHECK-NEXT: .quad {{.*}}xray_fn_idx_synth_0{{.*}} ; CHECK-NEXT: .section {{.*}}xray_instr_map -; CHECK-LABEL: Lxray_synthetic_0: +; CHECK-LABEL: Lxray_sleds_start0: ; CHECK: .quad {{.*}}xray_sled_0 ; CHECK: .quad {{.*}}xray_sled_1 -; CHECK-LABEL: Lxray_synthetic_end0: +; CHECK-LABEL: Lxray_sleds_end0: ; CHECK-NEXT: .section {{.*}}xray_fn_idx ; CHECK-LABEL: Lxray_fn_idx_synth_0: -; CHECK: .quad {{.*}}xray_synthetic_0 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_end0 +; CHECK: .quad {{.*}}xray_sleds_start0 +; CHECK-NEXT: .quad {{.*}}xray_sleds_end0 define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" { ; CHECK: .p2align 1, 0x90 @@ -42,13 +41,12 @@ ret i32 %retval } ; CHECK: .p2align 4, 0x90 -; CHECK-NEXT: .quad {{.*}}xray_synthetic_1{{.*}} ; CHECK-NEXT: .quad {{.*}}xray_fn_idx_synth_1{{.*}} -; CHECK-LABEL: Lxray_synthetic_1: +; CHECK-LABEL: Lxray_sleds_start1: ; CHECK: .quad {{.*}}xray_sled_2 ; CHECK: .quad {{.*}}xray_sled_3 -; CHECK-LABEL: Lxray_synthetic_end1: +; CHECK-LABEL: Lxray_sleds_end1: ; CHECK: .section {{.*}}xray_fn_idx ; CHECK-LABEL: Lxray_fn_idx_synth_1: -; CHECK: .quad {{.*}}xray_synthetic_1 -; CHECK: .quad {{.*}}xray_synthetic_end1 +; CHECK: .quad {{.*}}xray_sleds_start1 +; CHECK: .quad {{.*}}xray_sleds_end1