| OLD | NEW |
| 1 //=== X86MCNaCl.cpp - Expansion of NaCl pseudo-instructions --*- C++ -*-=// | 1 //=== X86MCNaCl.cpp - Expansion of NaCl pseudo-instructions --*- C++ -*-=// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 //===----------------------------------------------------------------------===// | 10 //===----------------------------------------------------------------------===// |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 cl::init(true)); | 41 cl::init(true)); |
| 42 | 42 |
| 43 const int kNaClX86InstructionBundleSize = 32; | 43 const int kNaClX86InstructionBundleSize = 32; |
| 44 | 44 |
| 45 // See the notes below where these functions are defined. | 45 // See the notes below where these functions are defined. |
| 46 namespace { | 46 namespace { |
| 47 unsigned getX86SubSuperRegister_(unsigned Reg, EVT VT, bool High=false); | 47 unsigned getX86SubSuperRegister_(unsigned Reg, EVT VT, bool High=false); |
| 48 unsigned DemoteRegTo32_(unsigned RegIn); | 48 unsigned DemoteRegTo32_(unsigned RegIn); |
| 49 } // namespace | 49 } // namespace |
| 50 | 50 |
| 51 static MCSymbol *CreateTempLabel(MCContext &Context, const char *Prefix) { | |
| 52 SmallString<128> NameSV; | |
| 53 raw_svector_ostream(NameSV) | |
| 54 << Context.getAsmInfo()->getPrivateGlobalPrefix() // get internal label | |
| 55 << Prefix << Context.getUniqueSymbolID(); | |
| 56 return Context.GetOrCreateSymbol(NameSV); | |
| 57 } | |
| 58 | |
| 59 static void PushReturnAddress(const llvm::MCSubtargetInfo &STI, | 51 static void PushReturnAddress(const llvm::MCSubtargetInfo &STI, |
| 60 MCContext &Context, MCStreamer &Out, | 52 MCContext &Context, MCStreamer &Out, |
| 61 MCSymbol *RetTarget) { | 53 MCSymbol *RetTarget) { |
| 62 const MCExpr *RetTargetExpr = MCSymbolRefExpr::Create(RetTarget, Context); | 54 const MCExpr *RetTargetExpr = MCSymbolRefExpr::Create(RetTarget, Context); |
| 63 if (Context.getObjectFileInfo()->getRelocM() == Reloc::PIC_) { | 55 if (Context.getObjectFileInfo()->getRelocM() == Reloc::PIC_) { |
| 64 // Calculate return_addr | 56 // Calculate return_addr |
| 65 // The return address should not be calculated into R11 because if the push | 57 // The return address should not be calculated into R11 because if the push |
| 66 // instruction ends up at the start of a bundle, an attacker could arrange | 58 // instruction ends up at the start of a bundle, an attacker could arrange |
| 67 // an indirect jump to it, which would push the full jump target | 59 // an indirect jump to it, which would push the full jump target |
| 68 // (which itself was calculated into r11) onto the stack. | 60 // (which itself was calculated into r11) onto the stack. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 // When generating PIC code, calculate the return address manually: | 100 // When generating PIC code, calculate the return address manually: |
| 109 // leal return_addr(%rip), %r10d | 101 // leal return_addr(%rip), %r10d |
| 110 // push %r10 | 102 // push %r10 |
| 111 // jmp target | 103 // jmp target |
| 112 // .align 32 | 104 // .align 32 |
| 113 // return_addr: | 105 // return_addr: |
| 114 | 106 |
| 115 MCContext &Context = Out.getContext(); | 107 MCContext &Context = Out.getContext(); |
| 116 | 108 |
| 117 // Generate a label for the return address. | 109 // Generate a label for the return address. |
| 118 MCSymbol *RetTarget = CreateTempLabel(Context, "DirectCallRetAddr"); | 110 MCSymbol *RetTarget = Context.createTempSymbol("DirectCallRetAddr", true); |
| 119 | 111 |
| 120 PushReturnAddress(STI, Context, Out, RetTarget); | 112 PushReturnAddress(STI, Context, Out, RetTarget); |
| 121 | 113 |
| 122 // jmp target | 114 // jmp target |
| 123 MCInst JMPInst; | 115 MCInst JMPInst; |
| 124 JMPInst.setOpcode(X86::JMP_4); | 116 JMPInst.setOpcode(X86::JMP_4); |
| 125 JMPInst.addOperand(Op); | 117 JMPInst.addOperand(Op); |
| 126 Out.EmitInstruction(JMPInst, STI); | 118 Out.EmitInstruction(JMPInst, STI); |
| 127 | 119 |
| 128 Out.EmitCodeAlignment(kNaClX86InstructionBundleSize); | 120 Out.EmitCodeAlignment(kNaClX86InstructionBundleSize); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 MCInst MOVInst; | 190 MCInst MOVInst; |
| 199 MOVInst.setOpcode(X86::MOV32rr); | 191 MOVInst.setOpcode(X86::MOV32rr); |
| 200 MOVInst.addOperand(MCOperand::CreateReg(SafeReg32)); | 192 MOVInst.addOperand(MCOperand::CreateReg(SafeReg32)); |
| 201 MOVInst.addOperand(MCOperand::CreateReg(Reg32)); | 193 MOVInst.addOperand(MCOperand::CreateReg(Reg32)); |
| 202 Out.EmitInstruction(MOVInst, STI); | 194 Out.EmitInstruction(MOVInst, STI); |
| 203 Reg32 = SafeReg32; | 195 Reg32 = SafeReg32; |
| 204 } | 196 } |
| 205 if (IsCall) { | 197 if (IsCall) { |
| 206 MCContext &Context = Out.getContext(); | 198 MCContext &Context = Out.getContext(); |
| 207 // Generate a label for the return address. | 199 // Generate a label for the return address. |
| 208 RetTarget = CreateTempLabel(Context, "IndirectCallRetAddr"); | 200 RetTarget = Context.createTempSymbol("IndirectCallRetAddr", true); |
| 209 // Explicitly push the (32-bit) return address for a NaCl64 call | 201 // Explicitly push the (32-bit) return address for a NaCl64 call |
| 210 // instruction. | 202 // instruction. |
| 211 PushReturnAddress(STI, Context, Out, RetTarget); | 203 PushReturnAddress(STI, Context, Out, RetTarget); |
| 212 } | 204 } |
| 213 } | 205 } |
| 214 const unsigned Reg64 = getX86SubSuperRegister_(Reg32, MVT::i64); | 206 const unsigned Reg64 = getX86SubSuperRegister_(Reg32, MVT::i64); |
| 215 | 207 |
| 216 const bool WillEmitCallInst = IsCall && !HideSandboxBase; | 208 const bool WillEmitCallInst = IsCall && !HideSandboxBase; |
| 217 Out.EmitBundleLock(WillEmitCallInst); | 209 Out.EmitBundleLock(WillEmitCallInst); |
| 218 | 210 |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 | 825 |
| 834 unsigned DemoteRegTo32_(unsigned RegIn) { | 826 unsigned DemoteRegTo32_(unsigned RegIn) { |
| 835 if (RegIn == 0) | 827 if (RegIn == 0) |
| 836 return 0; | 828 return 0; |
| 837 unsigned RegOut = getX86SubSuperRegister_(RegIn, MVT::i32, false); | 829 unsigned RegOut = getX86SubSuperRegister_(RegIn, MVT::i32, false); |
| 838 assert(RegOut != 0); | 830 assert(RegOut != 0); |
| 839 return RegOut; | 831 return RegOut; |
| 840 } | 832 } |
| 841 } //namespace | 833 } //namespace |
| 842 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | 834 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
| OLD | NEW |