diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-01-22 21:16:09 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-01-22 21:16:09 +0000 | 
| commit | dadbdfff07596fc3b48cc1e735181b9b8c893f67 (patch) | |
| tree | b27dffbc94bfeb477e1ff5e484d34d409ec05813 /lib/Target | |
| parent | dfab1a98e00a97e03f1d59a3cbdc33ced8622a9c (diff) | |
Diffstat (limited to 'lib/Target')
| -rw-r--r-- | lib/Target/AArch64/AArch64ISelLowering.cpp | 9 | ||||
| -rw-r--r-- | lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp | 14 | ||||
| -rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 9 | ||||
| -rw-r--r-- | lib/Target/X86/X86CallingConv.td | 4 | ||||
| -rw-r--r-- | lib/Target/X86/X86FrameLowering.cpp | 18 | ||||
| -rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 9 | 
6 files changed, 47 insertions, 16 deletions
| diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index 4ecfbe9e2280..9b73c5e9d952 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -10133,6 +10133,7 @@ void AArch64TargetLowering::insertCopiesSplitCSR(    const TargetInstrInfo *TII = Subtarget->getInstrInfo();    MachineRegisterInfo *MRI = &Entry->getParent()->getRegInfo(); +  MachineBasicBlock::iterator MBBI = Entry->begin();    for (const MCPhysReg *I = IStart; *I; ++I) {      const TargetRegisterClass *RC = nullptr;      if (AArch64::GPR64RegClass.contains(*I)) @@ -10152,13 +10153,13 @@ void AArch64TargetLowering::insertCopiesSplitCSR(                 Attribute::NoUnwind) &&             "Function should be nounwind in insertCopiesSplitCSR!");      Entry->addLiveIn(*I); -    BuildMI(*Entry, Entry->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -            NewVR) +    BuildMI(*Entry, MBBI, DebugLoc(), TII->get(TargetOpcode::COPY), NewVR)          .addReg(*I); +    // Insert the copy-back instructions right before the terminator.      for (auto *Exit : Exits) -      BuildMI(*Exit, Exit->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -              *I) +      BuildMI(*Exit, Exit->getFirstTerminator(), DebugLoc(), +              TII->get(TargetOpcode::COPY), *I)            .addReg(NewVR);    }  } diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp index d26604f5765d..685907a2178e 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp @@ -112,9 +112,21 @@ public:      MCELFStreamer::EmitInstruction(Inst, STI);    } +  /// Emit a 32-bit value as an instruction. This is only used for the .inst +  /// directive, EmitInstruction should be used in other cases.    void emitInst(uint32_t Inst) { +    char Buffer[4]; + +    // We can't just use EmitIntValue here, as that will emit a data mapping +    // symbol, and swap the endianness on big-endian systems (instructions are +    // always little-endian). +    for (unsigned I = 0; I < 4; ++I) { +      Buffer[I] = uint8_t(Inst); +      Inst >>= 8; +    } +      EmitA64MappingSymbol(); -    MCELFStreamer::EmitIntValue(Inst, 4); +    MCELFStreamer::EmitBytes(StringRef(Buffer, 4));    }    /// This is one of the functions used to emit data into an ELF section, so the diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 37c0795af283..978e99cf511e 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -12423,6 +12423,7 @@ void ARMTargetLowering::insertCopiesSplitCSR(    const TargetInstrInfo *TII = Subtarget->getInstrInfo();    MachineRegisterInfo *MRI = &Entry->getParent()->getRegInfo(); +  MachineBasicBlock::iterator MBBI = Entry->begin();    for (const MCPhysReg *I = IStart; *I; ++I) {      const TargetRegisterClass *RC = nullptr;      if (ARM::GPRRegClass.contains(*I)) @@ -12442,13 +12443,13 @@ void ARMTargetLowering::insertCopiesSplitCSR(                 Attribute::NoUnwind) &&             "Function should be nounwind in insertCopiesSplitCSR!");      Entry->addLiveIn(*I); -    BuildMI(*Entry, Entry->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -            NewVR) +    BuildMI(*Entry, MBBI, DebugLoc(), TII->get(TargetOpcode::COPY), NewVR)          .addReg(*I); +    // Insert the copy-back instructions right before the terminator.      for (auto *Exit : Exits) -      BuildMI(*Exit, Exit->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -              *I) +      BuildMI(*Exit, Exit->getFirstTerminator(), DebugLoc(), +              TII->get(TargetOpcode::COPY), *I)            .addReg(NewVR);    }  } diff --git a/lib/Target/X86/X86CallingConv.td b/lib/Target/X86/X86CallingConv.td index e8b96e74a7af..ed2e88067168 100644 --- a/lib/Target/X86/X86CallingConv.td +++ b/lib/Target/X86/X86CallingConv.td @@ -832,10 +832,10 @@ def CSR_64_TLS_Darwin : CalleeSavedRegs<(add CSR_64, RCX, RDX, RSI,                                               R8, R9, R10, R11)>;  // CSRs that are handled by prologue, epilogue. -def CSR_64_CXX_TLS_Darwin_PE : CalleeSavedRegs<(add)>; +def CSR_64_CXX_TLS_Darwin_PE : CalleeSavedRegs<(add RBP)>;  // CSRs that are handled explicitly via copies. -def CSR_64_CXX_TLS_Darwin_ViaCopy : CalleeSavedRegs<(add CSR_64_TLS_Darwin)>; +def CSR_64_CXX_TLS_Darwin_ViaCopy : CalleeSavedRegs<(sub CSR_64_TLS_Darwin, RBP)>;  // All GPRs - except r11  def CSR_64_RT_MostRegs : CalleeSavedRegs<(add CSR_64, RAX, RCX, RDX, RSI, RDI, diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 8632bb8254f9..7f8ce4768c00 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -2031,6 +2031,10 @@ void X86FrameLowering::adjustForSegmentedStacks(    unsigned TlsReg, TlsOffset;    DebugLoc DL; +  // To support shrink-wrapping we would need to insert the new blocks +  // at the right place and update the branches to PrologueMBB. +  assert(&(*MF.begin()) == &PrologueMBB && "Shrink-wrapping not supported yet"); +    unsigned ScratchReg = GetScratchRegister(Is64Bit, IsLP64, MF, true);    assert(!MF.getRegInfo().isLiveIn(ScratchReg) &&           "Scratch register is live-in"); @@ -2271,6 +2275,11 @@ void X86FrameLowering::adjustForHiPEPrologue(      MachineFunction &MF, MachineBasicBlock &PrologueMBB) const {    MachineFrameInfo *MFI = MF.getFrameInfo();    DebugLoc DL; + +  // To support shrink-wrapping we would need to insert the new blocks +  // at the right place and update the branches to PrologueMBB. +  assert(&(*MF.begin()) == &PrologueMBB && "Shrink-wrapping not supported yet"); +    // HiPE-specific values    const unsigned HipeLeafWords = 24;    const unsigned CCRegisteredArgs = Is64Bit ? 6 : 5; @@ -2584,7 +2593,14 @@ bool X86FrameLowering::canUseAsEpilogue(const MachineBasicBlock &MBB) const {  bool X86FrameLowering::enableShrinkWrapping(const MachineFunction &MF) const {    // If we may need to emit frameless compact unwind information, give    // up as this is currently broken: PR25614. -  return MF.getFunction()->hasFnAttribute(Attribute::NoUnwind) || hasFP(MF); +  return (MF.getFunction()->hasFnAttribute(Attribute::NoUnwind) || hasFP(MF)) && +         // The lowering of segmented stack and HiPE only support entry blocks +         // as prologue blocks: PR26107. +         // This limitation may be lifted if we fix: +         // - adjustForSegmentedStacks +         // - adjustForHiPEPrologue +         MF.getFunction()->getCallingConv() != CallingConv::HiPE && +         !MF.shouldSplitStack();  }  MachineBasicBlock::iterator X86FrameLowering::restoreWin32EHStackPointers( diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index b723059f091d..6904714ec781 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -28908,6 +28908,7 @@ void X86TargetLowering::insertCopiesSplitCSR(    const TargetInstrInfo *TII = Subtarget->getInstrInfo();    MachineRegisterInfo *MRI = &Entry->getParent()->getRegInfo(); +  MachineBasicBlock::iterator MBBI = Entry->begin();    for (const MCPhysReg *I = IStart; *I; ++I) {      const TargetRegisterClass *RC = nullptr;      if (X86::GR64RegClass.contains(*I)) @@ -28925,13 +28926,13 @@ void X86TargetLowering::insertCopiesSplitCSR(                 Attribute::NoUnwind) &&             "Function should be nounwind in insertCopiesSplitCSR!");      Entry->addLiveIn(*I); -    BuildMI(*Entry, Entry->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -            NewVR) +    BuildMI(*Entry, MBBI, DebugLoc(), TII->get(TargetOpcode::COPY), NewVR)          .addReg(*I); +    // Insert the copy-back instructions right before the terminator.      for (auto *Exit : Exits) -      BuildMI(*Exit, Exit->begin(), DebugLoc(), TII->get(TargetOpcode::COPY), -              *I) +      BuildMI(*Exit, Exit->getFirstTerminator(), DebugLoc(), +              TII->get(TargetOpcode::COPY), *I)            .addReg(NewVR);    }  } | 
