[llvm] r311525 - [XRay][CodeGen] Use PIC-friendly code in XRay sleds; remove synthetic references in .text

Daniel Jasper via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 31 08:22:38 PDT 2017


This breaks some of our internal tests. I have reverted it for now in
r312243. Will follow up with repro instructions.

On Wed, Aug 23, 2017 at 6:49 AM, Dean Michael Berris via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dberris
> Date: Tue Aug 22 21:49:41 2017
> New Revision: 311525
>
> URL: http://llvm.org/viewvc/llvm-project?rev=311525&view=rev
> Log:
> [XRay][CodeGen] Use PIC-friendly code in XRay sleds; remove synthetic
> references in .text
>
> Summary:
> This change achieves two things:
>
>   - Redefine the Custom Event handling instrumentation points emitted by
>     the compiler to not require dynamic relocation of references to the
>     __xray_CustomEvent trampoline.
>
>   - Remove the synthetic reference we emit at the end of a function that
>     we used to keep auxiliary sections alive in favour of SHF_LINK_ORDER
>     associated with the section where the function is defined.
>
> To achieve the custom event handling change, we've had to introduce the
> concept of sled versioning -- this will need to be supported by the
> runtime to allow us to understand how to turn on/off the new version of
> the custom event handling sleds. That change has to land first before we
> change the way we write the sleds.
>
> To remove the synthetic reference, we rely on a relatively new linker
> feature that preserves the sections that are associated with each other.
> This allows us to limit the effects on the .text section of ELF
> binaries.
>
> Because we're still using absolute references that are resolved at
> runtime for the instrumentation map (and function index) maps, we mark
> these sections write-able. In the future we can re-define the entries in
> the map to use relative relocations instead that can be statically
> determined by the linker. That change will be a bit more invasive so we
> defer this for later.
>
> Depends on D36816.
>
> Reviewers: dblaikie, echristo, pcc
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D36615
>
> Modified:
>     llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>     llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
>     llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll
>     llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll
>     llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
>     llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
>     llvm/trunk/test/CodeGen/Mips/xray-section-group.ll
>     llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll
>     llvm/trunk/test/CodeGen/X86/xray-custom-log.ll
>     llvm/trunk/test/CodeGen/X86/xray-log-args.ll
>     llvm/trunk/test/CodeGen/X86/xray-loop-detection.ll
>     llvm/trunk/test/CodeGen/X86/xray-section-group.ll
>     llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/CodeGen/AsmPrinter.h?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Tue Aug 22 21:49:41 2017
> @@ -235,13 +235,15 @@ public:
>
>    // The table will contain these structs that point to the sled, the
> function
>    // containing the sled, and what kind of sled (and whether they should
> always
> -  // be instrumented).
> +  // be instrumented). We also use a version identifier that the runtime
> can use
> +  // to decide what to do with the sled, depending on the version of the
> sled.
>    struct XRayFunctionEntry {
>      const MCSymbol *Sled;
>      const MCSymbol *Function;
>      SledKind Kind;
>      bool AlwaysInstrument;
>      const class Function *Fn;
> +    uint8_t Version;
>
>      void emit(int, MCStreamer *, const MCSymbol *) const;
>    };
> @@ -249,8 +251,12 @@ public:
>    // All the sleds to be emitted.
>    SmallVector<XRayFunctionEntry, 4> Sleds;
>
> +  // A unique ID used for ELF sections associated with a particular
> function.
> +  unsigned XRayFnUniqueID = 0;
> +
>    // Helper function to record a given XRay sled.
> -  void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind);
> +  void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind,
> +                  uint8_t Version = 0);
>
>    /// Emit a table with all XRay instrumentation points.
>    void emitXRayTable();
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> CodeGen/AsmPrinter/AsmPrinter.cpp?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Aug 22 21:49:41
> 2017
> @@ -2767,10 +2767,13 @@ void AsmPrinter::XRayFunctionEntry::emit
>    Out->EmitSymbolValue(Sled, Bytes);
>    Out->EmitSymbolValue(CurrentFnSym, Bytes);
>    auto Kind8 = static_cast<uint8_t>(Kind);
> -  Out->EmitBytes(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
> -  Out->EmitBytes(
> +  Out->EmitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8),
> 1));
> +  Out->EmitBinaryData(
>        StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
> -  Out->EmitZeros(2 * Bytes - 2);  // Pad the previous two entries
> +  Out->EmitBinaryData(StringRef(reinterpret_cast<const char
> *>(&Version), 1));
> +  auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
> +  assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
> +  Out->EmitZeros(Padding);
>  }
>
>  void AsmPrinter::emitXRayTable() {
> @@ -2782,19 +2785,22 @@ void AsmPrinter::emitXRayTable() {
>    MCSection *InstMap = nullptr;
>    MCSection *FnSledIndex = nullptr;
>    if (MF->getSubtarget().getTargetTriple().isOSBinFormatELF()) {
> +    auto Associated = dyn_cast<MCSymbolELF>(
> PrevSection->getBeginSymbol());
> +    assert(Associated != nullptr);
> +    auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
> +    std::string GroupName;
>      if (Fn->hasComdat()) {
> -      InstMap = OutContext.getELFSection("xray_instr_map",
> ELF::SHT_PROGBITS,
> -                                         ELF::SHF_ALLOC | ELF::SHF_GROUP,
> 0,
> -                                         Fn->getComdat()->getName());
> -      FnSledIndex = OutContext.getELFSection("xray_fn_idx",
> ELF::SHT_PROGBITS,
> -                                             ELF::SHF_ALLOC |
> ELF::SHF_GROUP, 0,
> -                                             Fn->getComdat()->getName());
> -    } else {
> -      InstMap = OutContext.getELFSection("xray_instr_map",
> ELF::SHT_PROGBITS,
> -                                         ELF::SHF_ALLOC);
> -      FnSledIndex = OutContext.getELFSection("xray_fn_idx",
> ELF::SHT_PROGBITS,
> -                                             ELF::SHF_ALLOC);
> +      Flags |= ELF::SHF_GROUP;
> +      GroupName = Fn->getComdat()->getName();
>      }
> +
> +    auto UniqueID = ++XRayFnUniqueID;
> +    InstMap =
> +        OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS,
> Flags, 0,
> +                                 GroupName, UniqueID, Associated);
> +    FnSledIndex =
> +        OutContext.getELFSection("xray_fn_idx", ELF::SHT_PROGBITS,
> Flags, 0,
> +                                 GroupName, UniqueID, Associated);
>    } else if (MF->getSubtarget().getTargetTriple().isOSBinFormatMachO()) {
>      InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map", 0,
>                                           SectionKind::
> getReadOnlyWithRel());
> @@ -2804,15 +2810,7 @@ void AsmPrinter::emitXRayTable() {
>      llvm_unreachable("Unsupported target");
>    }
>
> -  // Before we switch over, we force a reference to a label inside the
> -  // 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 *IdxRef = OutContext.createTempSymbol("xray_fn_idx_synth_",
> true);
> -  OutStreamer->EmitCodeAlignment(16);
> -  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
> @@ -2831,15 +2829,14 @@ void AsmPrinter::emitXRayTable() {
>    // pointers. This should work for both 32-bit and 64-bit platforms.
>    OutStreamer->SwitchSection(FnSledIndex);
>    OutStreamer->EmitCodeAlignment(2 * WordSizeBytes);
> -  OutStreamer->EmitLabel(IdxRef);
> -  OutStreamer->EmitSymbolValue(SledsStart, WordSizeBytes);
> -  OutStreamer->EmitSymbolValue(SledsEnd, WordSizeBytes);
> +  OutStreamer->EmitSymbolValue(SledsStart, WordSizeBytes, false);
> +  OutStreamer->EmitSymbolValue(SledsEnd, WordSizeBytes, false);
>    OutStreamer->SwitchSection(PrevSection);
>    Sleds.clear();
>  }
>
>  void AsmPrinter::recordSled(MCSymbol *Sled, const MachineInstr &MI,
> -  SledKind Kind) {
> +                            SledKind Kind, uint8_t Version) {
>    auto Fn = MI.getParent()->getParent()->getFunction();
>    auto Attr = Fn->getFnAttribute("function-instrument");
>    bool LogArgs = Fn->hasFnAttribute("xray-log-args");
> @@ -2847,8 +2844,8 @@ void AsmPrinter::recordSled(MCSymbol *Sl
>      Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
>    if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
>      Kind = SledKind::LOG_ARGS_ENTER;
> -  Sleds.emplace_back(
> -    XRayFunctionEntry{ Sled, CurrentFnSym, Kind, AlwaysInstrument, Fn });
> +  Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
> +                                       AlwaysInstrument, Fn, Version});
>  }
>
>  uint16_t AsmPrinter::getDwarfVersion() const {
>
> Modified: llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/
> X86/X86MCInstLower.cpp?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Target/X86/X86MCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86MCInstLower.cpp Tue Aug 22 21:49:41 2017
> @@ -1047,20 +1047,20 @@ void X86AsmPrinter::LowerPATCHABLE_EVENT
>    // We want to emit the following pattern, which follows the x86 calling
>    // convention to prepare for the trampoline call to be patched in.
>    //
> -  //   <args placement according SysV64 calling convention>
>    //   .p2align 1, ...
>    // .Lxray_event_sled_N:
> -  //   jmp +N                    // jump across the call instruction
> -  //   callq __xray_CustomEvent  // force relocation to symbol
> -  //   <args cleanup, jump to here>
> -  //
> -  // The relative jump needs to jump forward 24 bytes:
> -  // 10 (args) + 5 (nops) + 9 (cleanup)
> +  //   jmp +N                    // jump across the instrumentation sled
> +  //   ...                       // set up arguments in register
> +  //   callq __xray_CustomEvent  // force dependency to symbol
> +  //   ...
> +  //   <jump here>
>    //
>    // After patching, it would look something like:
>    //
>    //   nopw (2-byte nop)
> +  //   ...
>    //   callq __xrayCustomEvent  // already lowered
> +  //   ...
>    //
>    // ---
>    // First we emit the label and the jump.
> @@ -1072,49 +1072,55 @@ void X86AsmPrinter::LowerPATCHABLE_EVENT
>    // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative
> offset as
>    // an operand (computed as an offset from the jmp instruction).
>    // FIXME: Find another less hacky way do force the relative jump.
> -  OutStreamer->EmitBytes("\xeb\x14");
> +  OutStreamer->EmitBinaryData("\xeb\x0f");
>
>    // The default C calling convention will place two arguments into %rcx
> and
>    // %rdx -- so we only work with those.
> -  unsigned UsedRegs[] = {X86::RDI, X86::RSI, X86::RAX};
> -
> -  // Because we will use %rax, we preserve that across the call.
> -  EmitAndCountInstruction(MCInstBuilder(X86::PUSH64r).addReg(X86::RAX));
> +  unsigned UsedRegs[] = {X86::RDI, X86::RSI};
> +  bool UsedMask[] = {false, false};
>
> -  // Then we put the operands in the %rdi and %rsi registers.
> +  // Then we put the operands in the %rdi and %rsi registers. We spill the
> +  // values in the register before we clobber them, and mark them as used
> in
> +  // UsedMask. In case the arguments are already in the correct register,
> we use
> +  // emit nops appropriately sized to keep the sled the same size in every
> +  // situation.
>    for (unsigned I = 0; I < MI.getNumOperands(); ++I)
>      if (auto Op = MCIL.LowerMachineOperand(&MI, MI.getOperand(I))) {
> -      if (Op->isImm())
> -        EmitAndCountInstruction(MCInstBuilder(X86::MOV64ri)
> +      assert(Op->isReg() && "Only support arguments in registers");
> +      if (Op->getReg() != UsedRegs[I]) {
> +        UsedMask[I] = true;
> +        EmitAndCountInstruction(
> +            MCInstBuilder(X86::PUSH64r).addReg(UsedRegs[I]));
> +        EmitAndCountInstruction(MCInstBuilder(X86::MOV64rr)
>                                      .addReg(UsedRegs[I])
> -                                    .addImm(Op->getImm()));
> -      else if (Op->isReg()) {
> -        if (Op->getReg() != UsedRegs[I])
> -          EmitAndCountInstruction(MCInstBuilder(X86::MOV64rr)
> -                                      .addReg(UsedRegs[I])
> -                                      .addReg(Op->getReg()));
> -        else
> -          EmitNops(*OutStreamer, 3, Subtarget->is64Bit(),
> getSubtargetInfo());
> +                                    .addReg(Op->getReg()));
> +      } else {
> +        EmitNops(*OutStreamer, 4, Subtarget->is64Bit(),
> getSubtargetInfo());
>        }
>      }
>
>    // We emit a hard dependency on the __xray_CustomEvent symbol, which is
> the
> -  // name of the trampoline to be implemented by the XRay runtime. We put
> this
> -  // explicitly in the %rax register.
> +  // name of the trampoline to be implemented by the XRay runtime.
>    auto TSym = OutContext.getOrCreateSymbol("__xray_CustomEvent");
>    MachineOperand TOp = MachineOperand::CreateMCSymbol(TSym);
> -  EmitAndCountInstruction(MCInstBuilder(X86::MOV64ri)
> -                              .addReg(X86::RAX)
> -                              .addOperand(MCIL.LowerSymbolOperand(TOp,
> TSym)));
>
>    // Emit the call instruction.
> -  EmitAndCountInstruction(MCInstBuilder(X86::CALL64r).addReg(X86::RAX));
> +  EmitAndCountInstruction(MCInstBuilder(X86::CALL64pcrel32)
> +                              .addOperand(MCIL.LowerSymbolOperand(TOp,
> TSym)));
>
>    // Restore caller-saved and used registers.
> +  for (unsigned I = sizeof UsedMask; I-- > 0;)
> +    if (UsedMask[I])
> +      EmitAndCountInstruction(MCInstBuilder(X86::POP64r).
> addReg(UsedRegs[I]));
> +    else
> +      EmitNops(*OutStreamer, 1, Subtarget->is64Bit(), getSubtargetInfo());
> +
>    OutStreamer->AddComment("xray custom event end.");
> -  EmitAndCountInstruction(MCInstBuilder(X86::POP64r).addReg(X86::RAX));
>
> -  recordSled(CurSled, MI, SledKind::CUSTOM_EVENT);
> +  // Record the sled version. Older versions of this sled were spelled
> +  // differently, so we let the runtime handle the different offsets we're
> +  // using.
> +  recordSled(CurSled, MI, SledKind::CUSTOM_EVENT, 1);
>  }
>
>  void X86AsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI,
> @@ -1125,7 +1131,6 @@ void X86AsmPrinter::LowerPATCHABLE_FUNCT
>    // .Lxray_sled_N:
>    //   jmp .tmpN
>    //   # 9 bytes worth of noops
> -  // .tmpN
>    //
>    // We need the 9 bytes because at runtime, we'd be patching over the
> full 11
>    // bytes with the following pattern:
> @@ -1136,14 +1141,12 @@ void X86AsmPrinter::LowerPATCHABLE_FUNCT
>    auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
>    OutStreamer->EmitCodeAlignment(2);
>    OutStreamer->EmitLabel(CurSled);
> -  auto Target = OutContext.createTempSymbol();
>
>    // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative
> offset as
>    // an operand (computed as an offset from the jmp instruction).
>    // FIXME: Find another less hacky way do force the relative jump.
>    OutStreamer->EmitBytes("\xeb\x09");
>    EmitNops(*OutStreamer, 9, Subtarget->is64Bit(), getSubtargetInfo());
> -  OutStreamer->EmitLabel(Target);
>    recordSled(CurSled, MI, SledKind::FUNCTION_ENTER);
>  }
>
>
> Modified: llvm/trunk/test/CodeGen/AArch64/xray-attribute-
> instrumentation.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/AArch64/xray-attribute-instrumentation.ll?rev=311525&r1=311524&r2=
> 311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll
> (original)
> +++ llvm/trunk/test/CodeGen/AArch64/xray-attribute-instrumentation.ll Tue
> Aug 22 21:49:41 2017
> @@ -24,9 +24,7 @@ define i32 @foo() nounwind noinline uwta
>  ; CHECK-LABEL: Ltmp1:
>  ; CHECK-NEXT:  ret
>  }
> -; CHECK:       .p2align 4
> -; CHECK-NEXT:  .xword .Lxray_fn_idx_synth_0
> -; CHECK-NEXT:  .section xray_instr_map,{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0
>  ; CHECK:       .xword .Lxray_sled_0
>  ; CHECK:       .xword .Lxray_sled_1
>
> Modified: llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/AArch64/xray-tail-call-sled.ll?rev=311525&r1=
> 311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/xray-tail-call-sled.ll Tue Aug 22
> 21:49:41 2017
> @@ -27,15 +27,12 @@ define i32 @callee() nounwind noinline u
>  ; CHECK-LABEL: .Ltmp1:
>  ; CHECK-NEXT:  ret
>  }
> -; CHECK:       .p2align 4
> -; CHECK-NEXT:  .xword .Lxray_fn_idx_synth_0
> -; CHECK-NEXT:  .section xray_instr_map,{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .xword .Lxray_sled_0
>  ; CHECK:       .xword .Lxray_sled_1
>  ; CHECK-LABEL: Lxray_sleds_end0:
> -; CHECK:       .section xray_fn_idx,{{.*}}
> -; CHECK-LABEL: Lxray_fn_idx_synth_0:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .xword .Lxray_sleds_start0
>  ; CHECK-NEXT:  .xword .Lxray_sleds_end0
>
> @@ -66,14 +63,11 @@ define i32 @caller() nounwind noinline u
>  ; CHECK:       b       callee
>    ret i32 %retval
>  }
> -; CHECK:       .p2align 4
> -; CHECK-NEXT:  .xword .Lxray_fn_idx_synth_1
> -; CHECK-NEXT:  .section xray_instr_map,{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start1:
>  ; CHECK:       .xword .Lxray_sled_2
>  ; CHECK:       .xword .Lxray_sled_3
>  ; CHECK-LABEL: Lxray_sleds_end1:
>  ; CHECK:       .section xray_fn_idx,{{.*}}
> -; CHECK-LABEL: Lxray_fn_idx_synth_1:
>  ; CHECK:       .xword .Lxray_sleds_start1
>  ; CHECK-NEXT:  .xword .Lxray_sleds_end1
>
> Modified: llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-
> instrumentation.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/ARM/xray-armv6-attribute-instrumentation.ll?
> rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
> (original)
> +++ llvm/trunk/test/CodeGen/ARM/xray-armv6-attribute-instrumentation.ll
> Tue Aug 22 21:49:41 2017
> @@ -23,14 +23,11 @@ define i32 @foo() nounwind noinline uwta
>  ; CHECK-LABEL: Ltmp1:
>  ; CHECK-NEXT:  bx      lr
>  }
> -; CHECK:       .p2align 4
> -; CHECK-NEXT:  .long {{.*}}Lxray_fn_idx_synth_0
> -; CHECK-NEXT:  .section {{.*}}xray_instr_map{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .long {{.*}}Lxray_sled_0
>  ; CHECK:       .long {{.*}}Lxray_sled_1
>  ; CHECK-LABEL: Lxray_sleds_end0:
> -; CHECK:       .section {{.*}}xray_fn_idx{{.*}}
> -; CHECK-LABEL: Lxray_fn_idx_synth_0:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .long {{.*}}Lxray_sleds_start0
>  ; CHECK-NEXT:  .long {{.*}}Lxray_sleds_end0
>
> Modified: llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-
> instrumentation.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/ARM/xray-armv7-attribute-instrumentation.ll?
> rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
> (original)
> +++ llvm/trunk/test/CodeGen/ARM/xray-armv7-attribute-instrumentation.ll
> Tue Aug 22 21:49:41 2017
> @@ -23,15 +23,12 @@ define i32 @foo() nounwind noinline uwta
>  ; CHECK-LABEL: Ltmp1:
>  ; CHECK-NEXT:  bx lr
>  }
> -; CHECK:       .p2align 4
> -; CHECK-NEXT:  .long {{.*}}Lxray_fn_idx_synth_0
> -; CHECK-NEXT:  .section {{.*}}xray_instr_map{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .long {{.*}}Lxray_sled_0
>  ; CHECK:       .long {{.*}}Lxray_sled_1
>  ; CHECK-LABEL: Lxray_sleds_end0:
> -; CHECK:       .section {{.*}}xray_fn_idx{{.*}}
> -; CHECK-LABEL: Lxray_fn_idx_synth_0:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .long {{.*}}xray_sleds_start0
>  ; CHECK-NEXT:  .long {{.*}}xray_sleds_end0
>
>
> Modified: llvm/trunk/test/CodeGen/Mips/xray-section-group.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/Mips/xray-section-group.ll?rev=311525&r1=311524&
> r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/Mips/xray-section-group.ll (original)
> +++ llvm/trunk/test/CodeGen/Mips/xray-section-group.ll Tue Aug 22
> 21:49:41 2017
> @@ -14,7 +14,7 @@
>  define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always"
> {
>  ; CHECK: .section .text.foo,"ax", at progbits
>    ret i32 0
> -; CHECK: .section xray_instr_map,"a", at progbits
> +; CHECK: .section xray_instr_map,"awo", at progbits,.text.foo,unique,1
>  }
>
>  ; CHECK-OBJ: Section {
> @@ -24,7 +24,7 @@ $bar = comdat any
>  define i32 @bar() nounwind noinline uwtable "function-instrument"="xray-always"
> comdat($bar) {
>  ; CHECK: .section .text.bar,"axG", at progbits,bar,comdat
>    ret i32 1
> -; CHECK: .section xray_instr_map,"aG", at progbits,bar,comdat
> +; CHECK: .section xray_instr_map,"aGwo", at progbits,bar,comdat,.text.bar,
> unique,2
>  }
>
>  ; CHECK-OBJ: Section {
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-attribute-instrumentation.ll?rev=311525&
> r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll
> (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-attribute-instrumentation.ll Tue Aug
> 22 21:49:41 2017
> @@ -1,27 +1,25 @@
>  ; RUN: llc -filetype=asm -o - -mtriple=x86_64-unknown-linux-gnu < %s |
> FileCheck %s
> +; RUN: llc -filetype=asm -o - -mtriple=x86_64-unknown-linux-gnu \
> +; RUN:    -relocation-model=pic < %s | FileCheck %s
>  ; RUN: llc -filetype=asm -o - -mtriple=x86_64-darwin-unknown    < %s |
> FileCheck %s
>
>  define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always"
> {
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_0:
> -; CHECK-NEXT:  .ascii "\353\t"
> +; CHECK:       .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp0:
>    ret i32 0
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_1:
> -; CHECK-NEXT:  retq
> +; CHECK:       retq
>  ; CHECK-NEXT:  nopw %cs:512(%rax,%rax)
>  }
> -; CHECK:       .p2align 4, 0x90
> -; CHECK-NEXT:  .quad {{.*}}xray_fn_idx_synth_0
> -; CHECK-NEXT:  .section {{.*}}xray_instr_map
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .quad {{.*}}xray_sled_0
>  ; CHECK:       .quad {{.*}}xray_sled_1
>  ; CHECK-LABEL: Lxray_sleds_end0:
> -; CHECK:       .section {{.*}}xray_fn_idx
> -; CHECK-LABEL: Lxray_fn_idx_synth_0:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .quad {{.*}}xray_sleds_start0
>  ; CHECK-NEXT:  .quad {{.*}}xray_sleds_end0
>
> @@ -31,9 +29,8 @@ define i32 @foo() nounwind noinline uwta
>  define i32 @bar(i32 %i) nounwind noinline uwtable
> "function-instrument"="xray-always" {
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_2:
> -; CHECK-NEXT:  .ascii "\353\t"
> +; CHECK:       .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp1:
>  Test:
>    %cond = icmp eq i32 %i, 0
>    br i1 %cond, label %IsEqual, label %NotEqual
> @@ -41,24 +38,21 @@ IsEqual:
>    ret i32 0
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_3:
> -; CHECK-NEXT:  retq
> +; CHECK:       retq
>  ; CHECK-NEXT:  nopw %cs:512(%rax,%rax)
>  NotEqual:
>    ret i32 1
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_4:
> -; CHECK-NEXT:  retq
> +; CHECK:       retq
>  ; CHECK-NEXT:  nopw %cs:512(%rax,%rax)
>  }
> -; CHECK:       .p2align 4, 0x90
> -; CHECK-NEXT:  .quad {{.*}}xray_fn_idx_synth_1
> -; CHECK-NEXT:  .section {{.*}}xray_instr_map
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start1:
>  ; CHECK:       .quad {{.*}}xray_sled_2
>  ; CHECK:       .quad {{.*}}xray_sled_3
>  ; CHECK:       .quad {{.*}}xray_sled_4
>  ; CHECK-LABEL: Lxray_sleds_end1:
> -; CHECK:       .section {{.*}}xray_fn_idx
> -; CHECK-LABEL: Lxray_fn_idx_synth_1:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .quad {{.*}}xray_sleds_start1
>  ; CHECK-NEXT:  .quad {{.*}}xray_sleds_end1
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-custom-log.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-custom-log.ll?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-custom-log.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-custom-log.ll Tue Aug 22 21:49:41
> 2017
> @@ -7,16 +7,17 @@ define i32 @fn() nounwind noinline uwtab
>      %val = load i32, i32* %eventsize
>      call void @llvm.xray.customevent(i8* %eventptr, i32 %val)
>      ; CHECK-LABEL: Lxray_event_sled_0:
> -    ; CHECK-NEXT:  .ascii "\353\024
> -    ; CHECK-NEXT:  pushq %rax
> +    ; CHECK:       .byte 0xeb, 0x0f
> +    ; CHECK-NEXT:  pushq %rdi
>      ; CHECK-NEXT:  movq {{.*}}, %rdi
> +    ; CHECK-NEXT:  pushq %rsi
>      ; CHECK-NEXT:  movq {{.*}}, %rsi
> -    ; CHECK-NEXT:  movabsq $__xray_CustomEvent, %rax
> -    ; CHECK-NEXT:  callq *%rax
> -    ; CHECK-NEXT:  popq %rax
> +    ; CHECK-NEXT:  callq __xray_CustomEvent
> +    ; CHECK-NEXT:  popq %rsi
> +    ; CHECK-NEXT:  popq %rdi
>      ret i32 0
>  }
> -; CHECK:       .section {{.*}}xray_instr_map
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .quad {{.*}}xray_event_sled_0
>
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-log-args.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-log-args.ll?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-log-args.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-log-args.ll Tue Aug 22 21:49:41 2017
> @@ -7,29 +7,33 @@ define i32 @callee(i32 %arg) nounwind no
>    ret i32 %arg
>  }
>  ; CHECK-LABEL: Lxray_sleds_start0:
> -; CHECK:       .quad   {{\.?}}Lxray_sled_0
> -; CHECK:       .quad   {{_?}}callee
> -; CHECK:       .byte   3
> -; CHECK:       .byte   1
> -; CHECK:       .{{(zero|space)}}       14
> -; CHECK:       .quad   {{\.?}}Lxray_sled_1
> -; CHECK:       .quad   {{_?}}callee
> -; CHECK:       .byte   1
> -; CHECK:       .byte   1
> -; CHECK:       .{{(zero|space)}}       14
> +; CHECK:  .quad {{\.?}}Lxray_sled_0
> +; CHECK:  .quad {{_?}}callee
> +; CHECK:  .byte 0x03
> +; CHECK:  .byte 0x01
> +; CHECK:  .byte 0x00
> +; CHECK:  .{{(zero|space)}}  13
> +; CHECK:  .quad {{\.?}}Lxray_sled_1
> +; CHECK:  .quad {{_?}}callee
> +; CHECK:  .byte 0x01
> +; CHECK:  .byte 0x01
> +; CHECK:  .byte 0x00
> +; CHECK:  .{{(zero|space)}}  13
>
>  define i32 @caller(i32 %arg) nounwind noinline uwtable
> "function-instrument"="xray-always" "xray-log-args"="1" {
>    %retval = tail call i32 @callee(i32 %arg)
>    ret i32 %retval
>  }
>  ; CHECK-LABEL: Lxray_sleds_start1:
> -; CHECK:       .quad   {{\.?}}Lxray_sled_2
> -; CHECK:       .quad   {{_?}}caller
> -; CHECK:       .byte   3
> -; CHECK:       .byte   1
> -; CHECK:       .{{(zero|space)}}       14
> -; CHECK:       .quad   {{\.?}}Lxray_sled_3
> -; CHECK:       .quad   {{_?}}caller
> -; CHECK:       .byte   2
> -; CHECK:       .byte   1
> -; CHECK:       .{{(zero|space)}}       14
> +; CHECK:  .quad {{\.?}}Lxray_sled_2
> +; CHECK:  .quad {{_?}}caller
> +; CHECK:  .byte 0x03
> +; CHECK:  .byte 0x01
> +; CHECK:  .byte 0x00
> +; CHECK:  .{{(zero|space)}}  13
> +; CHECK:  .quad {{\.?}}Lxray_sled_3
> +; CHECK:  .quad {{_?}}caller
> +; CHECK:  .byte 0x02
> +; CHECK:  .byte 0x01
> +; CHECK:  .byte 0x00
> +; CHECK:  .{{(zero|space)}}  13
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-loop-detection.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-loop-detection.ll?rev=311525&r1=
> 311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-loop-detection.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-loop-detection.ll Tue Aug 22
> 21:49:41 2017
> @@ -19,5 +19,4 @@ Exit:
>  ; CHECK-LABEL: xray_sled_0:
>  ; CHECK-NEXT:  .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp0:
>
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-section-group.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-section-group.ll?rev=311525&r1=311524&r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-section-group.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-section-group.ll Tue Aug 22 21:49:41
> 2017
> @@ -5,14 +5,14 @@
>  define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always"
> {
>  ; CHECK: .section .text.foo,"ax", at progbits
>    ret i32 0
> -; CHECK: .section xray_instr_map,"a", at progbits
> +; CHECK: .section xray_instr_map,"awo", at progbits,.text.foo,unique,1
>  }
>
>  $bar = comdat any
>  define i32 @bar() nounwind noinline uwtable "function-instrument"="xray-always"
> comdat($bar) {
>  ; CHECK: .section .text.bar,"axG", at progbits,bar,comdat
>    ret i32 1
> -; CHECK: .section xray_instr_map,"aG", at progbits,bar,comdat
> +; CHECK: .section xray_instr_map,"aGwo", at progbits,bar,comdat,.text.bar,
> unique,2
>  }
>
>  ; CHECK-OBJ:      section xray_instr_map:
>
> Modified: llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/X86/xray-tail-call-sled.ll?rev=311525&r1=311524&
> r2=311525&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/xray-tail-call-sled.ll Tue Aug 22
> 21:49:41 2017
> @@ -4,49 +4,41 @@
>  define i32 @callee() nounwind noinline uwtable
> "function-instrument"="xray-always" {
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_0:
> -; CHECK-NEXT:  .ascii "\353\t"
> +; CHECK:       .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp0:
>    ret i32 0
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_1:
> -; CHECK-NEXT:  retq
> +; CHECK:       retq
>  ; CHECK-NEXT:  nopw %cs:512(%rax,%rax)
>  }
> -; CHECK:       .p2align 4, 0x90
> -; CHECK-NEXT:  .quad {{.*}}xray_fn_idx_synth_0{{.*}}
> -; CHECK-NEXT:  .section {{.*}}xray_instr_map
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start0:
>  ; CHECK:       .quad {{.*}}xray_sled_0
>  ; CHECK:       .quad {{.*}}xray_sled_1
>  ; CHECK-LABEL: Lxray_sleds_end0:
> -; CHECK-NEXT:  .section {{.*}}xray_fn_idx
> -; CHECK-LABEL: Lxray_fn_idx_synth_0:
> +; CHECK-LABEL: xray_fn_idx
>  ; 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
>  ; CHECK-LABEL: Lxray_sled_2:
> -; CHECK-NEXT:  .ascii "\353\t"
> +; CHECK:       .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp1:
>  ; CHECK:       .p2align 1, 0x90
>  ; CHECK-LABEL: Lxray_sled_3:
>  ; CHECK-NEXT:  .ascii "\353\t"
>  ; CHECK-NEXT:  nopw 512(%rax,%rax)
> -; CHECK-LABEL: Ltmp2:
>    %retval = tail call i32 @callee()
>  ; CHECK:       jmp {{.*}}callee {{.*}}# TAILCALL
>    ret i32 %retval
>  }
> -; CHECK:       .p2align 4, 0x90
> -; CHECK-NEXT:  .quad {{.*}}xray_fn_idx_synth_1{{.*}}
> +; CHECK-LABEL: xray_instr_map
>  ; CHECK-LABEL: Lxray_sleds_start1:
>  ; CHECK:       .quad {{.*}}xray_sled_2
>  ; CHECK:       .quad {{.*}}xray_sled_3
>  ; CHECK-LABEL: Lxray_sleds_end1:
> -; CHECK:       .section {{.*}}xray_fn_idx
> -; CHECK-LABEL: Lxray_fn_idx_synth_1:
> +; CHECK-LABEL: xray_fn_idx
>  ; CHECK:       .quad {{.*}}xray_sleds_start1
>  ; CHECK:       .quad {{.*}}xray_sleds_end1
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170831/6a81d2bf/attachment.html>


More information about the llvm-commits mailing list