| OLD | NEW |
| 1 //===- X86MCNaClExpander.cpp ------------------------------------*- C++ -*-===// | 1 //===- X86MCNaClExpander.cpp ------------------------------------*- 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 // This file implements the X86MCNaClExpander class, the X86 specific | 10 // This file implements the X86MCNaClExpander class, the X86 specific |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 unsigned getReg64(unsigned Reg); | 32 unsigned getReg64(unsigned Reg); |
| 33 | 33 |
| 34 static unsigned demoteOpcode(unsigned Reg); | 34 static unsigned demoteOpcode(unsigned Reg); |
| 35 | 35 |
| 36 static bool isAbsoluteReg(unsigned Reg) { | 36 static bool isAbsoluteReg(unsigned Reg) { |
| 37 Reg = getReg64(Reg); // Normalize to 64 bits | 37 Reg = getReg64(Reg); // Normalize to 64 bits |
| 38 return (Reg == X86::R15 || Reg == X86::RSP || Reg == X86::RBP || | 38 return (Reg == X86::R15 || Reg == X86::RSP || Reg == X86::RBP || |
| 39 Reg == X86::RIP); | 39 Reg == X86::RIP); |
| 40 } | 40 } |
| 41 | 41 |
| 42 bool X86::X86MCNaClExpander::isValidScratchRegister(unsigned Reg) const { |
| 43 // TODO(dschuff): Check the register class. |
| 44 if (isAbsoluteReg(Reg)) |
| 45 return false; |
| 46 return true; |
| 47 } |
| 48 |
| 49 |
| 42 static void PushReturnAddress(const llvm::MCSubtargetInfo &STI, | 50 static void PushReturnAddress(const llvm::MCSubtargetInfo &STI, |
| 43 MCContext &Context, MCStreamer &Out, | 51 MCContext &Context, MCStreamer &Out, |
| 44 MCSymbol *RetTarget) { | 52 MCSymbol *RetTarget) { |
| 45 const MCExpr *RetTargetExpr = MCSymbolRefExpr::Create(RetTarget, Context); | 53 const MCExpr *RetTargetExpr = MCSymbolRefExpr::Create(RetTarget, Context); |
| 46 if (Context.getObjectFileInfo()->getRelocM() == Reloc::PIC_) { | 54 if (Context.getObjectFileInfo()->getRelocM() == Reloc::PIC_) { |
| 47 // Calculate return_addr | 55 // Calculate return_addr |
| 48 // The return address should not be calculated into R11 because if the push | 56 // The return address should not be calculated into R11 because if the push |
| 49 // instruction ends up at the start of a bundle, an attacker could arrange | 57 // instruction ends up at the start of a bundle, an attacker could arrange |
| 50 // an indirect jump to it, which would push the full jump target | 58 // an indirect jump to it, which would push the full jump target |
| 51 // (which itself was calculated into r11) onto the stack. | 59 // (which itself was calculated into r11) onto the stack. |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 const MCSubtargetInfo &STI, | 566 const MCSubtargetInfo &STI, |
| 559 bool EmitPrefixes) { | 567 bool EmitPrefixes) { |
| 560 if (EmitPrefixes) { | 568 if (EmitPrefixes) { |
| 561 for (const MCInst &Prefix : Prefixes) | 569 for (const MCInst &Prefix : Prefixes) |
| 562 Out.EmitInstruction(Prefix, STI); | 570 Out.EmitInstruction(Prefix, STI); |
| 563 Prefixes.clear(); | 571 Prefixes.clear(); |
| 564 } | 572 } |
| 565 Out.EmitInstruction(Inst, STI); | 573 Out.EmitInstruction(Inst, STI); |
| 566 } | 574 } |
| 567 | 575 |
| 576 |
| 568 void X86::X86MCNaClExpander::doExpandInst(const MCInst &Inst, MCStreamer &Out, | 577 void X86::X86MCNaClExpander::doExpandInst(const MCInst &Inst, MCStreamer &Out, |
| 569 const MCSubtargetInfo &STI, | 578 const MCSubtargetInfo &STI, |
| 570 bool EmitPrefixes) { | 579 bool EmitPrefixes) { |
| 571 | 580 |
| 581 |
| 572 // Explicitly IGNORE all pseudo instructions, these will be handled in the | 582 // Explicitly IGNORE all pseudo instructions, these will be handled in the |
| 573 // older customExpandInst code | 583 // older customExpandInst code |
| 574 switch (Inst.getOpcode()) { | 584 switch (Inst.getOpcode()) { |
| 575 case X86::CALLpcrel32: | 585 case X86::CALLpcrel32: |
| 576 case X86::CALL64pcrel32: | 586 case X86::CALL64pcrel32: |
| 577 case X86::NACL_CALL64d: | 587 case X86::NACL_CALL64d: |
| 578 case X86::NACL_CALL32r: | 588 case X86::NACL_CALL32r: |
| 579 case X86::NACL_CALL64r: | 589 case X86::NACL_CALL64r: |
| 580 case X86::NACL_JMP32r: | 590 case X86::NACL_JMP32r: |
| 581 case X86::NACL_JMP64r: | 591 case X86::NACL_JMP64r: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 } | 638 } |
| 629 } | 639 } |
| 630 | 640 |
| 631 bool X86::X86MCNaClExpander::expandInst(const MCInst &Inst, MCStreamer &Out, | 641 bool X86::X86MCNaClExpander::expandInst(const MCInst &Inst, MCStreamer &Out, |
| 632 const MCSubtargetInfo &STI) { | 642 const MCSubtargetInfo &STI) { |
| 633 if (Guard) | 643 if (Guard) |
| 634 return false; | 644 return false; |
| 635 Guard = true; | 645 Guard = true; |
| 636 | 646 |
| 637 doExpandInst(Inst, Out, STI, true); | 647 doExpandInst(Inst, Out, STI, true); |
| 648 invalidateScratchRegs(Inst); |
| 638 | 649 |
| 639 Guard = false; | 650 Guard = false; |
| 640 return true; | 651 return true; |
| 641 } | 652 } |
| 642 | 653 |
| 643 static unsigned demoteOpcode(unsigned Opcode) { | 654 static unsigned demoteOpcode(unsigned Opcode) { |
| 644 switch (Opcode) { | 655 switch (Opcode) { |
| 645 case X86::ADC64rr: | 656 case X86::ADC64rr: |
| 646 return X86::ADC32rr; | 657 return X86::ADC32rr; |
| 647 case X86::ADC64ri8: | 658 case X86::ADC64ri8: |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 case X86::XOR64ri8: | 1190 case X86::XOR64ri8: |
| 1180 return X86::XOR32ri8; | 1191 return X86::XOR32ri8; |
| 1181 case X86::XOR64ri32: | 1192 case X86::XOR64ri32: |
| 1182 return X86::XOR32ri; | 1193 return X86::XOR32ri; |
| 1183 case X86::XOR64rm: | 1194 case X86::XOR64rm: |
| 1184 return X86::XOR32rm; | 1195 return X86::XOR32rm; |
| 1185 default: | 1196 default: |
| 1186 return Opcode; | 1197 return Opcode; |
| 1187 } | 1198 } |
| 1188 } | 1199 } |
| OLD | NEW |