Commit 8208e756 by Stefan Maksimovic Committed by Jim Stichnoth

Subzero, MIPS32: Changes for improving sandbox crosstest results

R=stichnot@chromium.org Review URL: https://codereview.chromium.org/2519863002 . Patch from Stefan Maksimovic <makdstefan@gmail.com>.
parent becb85f1
...@@ -69,6 +69,16 @@ void testCaller(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -69,6 +69,16 @@ void testCaller(size_t &TotalTests, size_t &Passes, size_t &Failures) {
void (*Subzero_Caller)(void); void (*Subzero_Caller)(void);
CalleePtrTy Callee; CalleePtrTy Callee;
} Funcs[] = { } Funcs[] = {
#ifdef MIPS32
#define X(caller, callee, argc) \
{ \
STR(caller), STR(callee), argc, &caller, &Subzero_::caller, \
reinterpret_cast<CalleePtrTy>(&Subzero_::callee), \
} \
,
TEST_FUNC_TABLE
#undef X
#else
#define X(caller, callee, argc) \ #define X(caller, callee, argc) \
{ \ { \
STR(caller), STR(callee), argc, &caller, &Subzero_::caller, \ STR(caller), STR(callee), argc, &caller, &Subzero_::caller, \
...@@ -77,6 +87,7 @@ void testCaller(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -77,6 +87,7 @@ void testCaller(size_t &TotalTests, size_t &Passes, size_t &Failures) {
, ,
TEST_FUNC_TABLE TEST_FUNC_TABLE
#undef X #undef X
#endif
}; };
const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
......
...@@ -158,7 +158,9 @@ def main(): ...@@ -158,7 +158,9 @@ def main():
bitcode] + arch_sz_flags[args.target]) bitcode] + arch_sz_flags[args.target])
if args.filetype != 'obj': if args.filetype != 'obj':
shellcmd(['{bin}/llvm-mc'.format(bin=bindir), shellcmd(['{bin}/llvm-mc'.format(bin=bindir),
'-triple=' + triple, '-triple=' + ('mipsel-linux-gnu'
if args.target == 'mips32' and args.sandbox
else triple),
'-filetype=obj', '-filetype=obj',
'-o=' + obj_sz, '-o=' + obj_sz,
asm_sz]) asm_sz])
......
...@@ -47,6 +47,8 @@ def RunNativePrefix(toolchain_root, target, attr, run_cmd): ...@@ -47,6 +47,8 @@ def RunNativePrefix(toolchain_root, target, attr, run_cmd):
'arm32-hwdiv-arm': ' -cpu cortex-a15', 'arm32-hwdiv-arm': ' -cpu cortex-a15',
'mips32-base': ' -cpu mips32r5-generic'}) 'mips32-base': ' -cpu mips32r5-generic'})
prefix = arch_map[target] + attr_map[target + '-' + attr] prefix = arch_map[target] + attr_map[target + '-' + attr]
if target == 'mips32':
prefix = 'QEMU_SET_ENV=LD_LIBRARY_PATH=/usr/mipsel-linux-gnu/lib/ ' + prefix
return (prefix + ' ' + run_cmd) if prefix else run_cmd return (prefix + ' ' + run_cmd) if prefix else run_cmd
def NonsfiLoaderArch(target): def NonsfiLoaderArch(target):
......
...@@ -650,7 +650,7 @@ void AssemblerMIPS32::jalr(const Operand *OpRs, const Operand *OpRd) { ...@@ -650,7 +650,7 @@ void AssemblerMIPS32::jalr(const Operand *OpRs, const Operand *OpRd) {
const IValueT Rs = encodeGPRegister(OpRs, "Rs", "jalr"); const IValueT Rs = encodeGPRegister(OpRs, "Rs", "jalr");
const IValueT Rd = const IValueT Rd =
(OpRd == nullptr) ? 31 : encodeGPRegister(OpRd, "Rd", "jalr"); (OpRd == nullptr) ? 31 : encodeGPRegister(OpRd, "Rd", "jalr");
Opcode |= Rd << 16; Opcode |= Rd << 11;
Opcode |= Rs << 21; Opcode |= Rs << 21;
emitInst(Opcode); emitInst(Opcode);
nop(); nop();
......
...@@ -5844,6 +5844,8 @@ TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx) ...@@ -5844,6 +5844,8 @@ TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx)
: TargetHeaderLowering(Ctx) {} : TargetHeaderLowering(Ctx) {}
void TargetHeaderMIPS32::lower() { void TargetHeaderMIPS32::lower() {
if (!BuildDefs::dump())
return;
OstreamLocker L(Ctx); OstreamLocker L(Ctx);
Ostream &Str = Ctx->getStrEmit(); Ostream &Str = Ctx->getStrEmit();
Str << "\t.set\t" Str << "\t.set\t"
...@@ -5852,6 +5854,8 @@ void TargetHeaderMIPS32::lower() { ...@@ -5852,6 +5854,8 @@ void TargetHeaderMIPS32::lower() {
<< "nomips16\n"; << "nomips16\n";
Str << "\t.set\t" Str << "\t.set\t"
<< "noat\n"; << "noat\n";
if (getFlags().getUseSandboxing())
Str << "\t.bundle_align_mode 4\n";
} }
SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
...@@ -5888,6 +5892,8 @@ void TargetMIPS32::Sandboxer::lw(Variable *Dest, OperandMIPS32Mem *Mem) { ...@@ -5888,6 +5892,8 @@ void TargetMIPS32::Sandboxer::lw(Variable *Dest, OperandMIPS32Mem *Mem) {
Target->_and(Base, Base, T7); Target->_and(Base, Base, T7);
} }
Target->_lw(Dest, Mem); Target->_lw(Dest, Mem);
if (Target->NeedSandboxing && (Dest->getRegNum() == Target->getStackReg()))
Target->_and(Dest, Dest, T7);
} }
void TargetMIPS32::Sandboxer::sw(Variable *Dest, OperandMIPS32Mem *Mem) { void TargetMIPS32::Sandboxer::sw(Variable *Dest, OperandMIPS32Mem *Mem) {
...@@ -5946,12 +5952,18 @@ void TargetMIPS32::Sandboxer::reset_sp(Variable *Src) { ...@@ -5946,12 +5952,18 @@ void TargetMIPS32::Sandboxer::reset_sp(Variable *Src) {
createAutoBundle(); createAutoBundle();
Target->_mov(SP, Src); Target->_mov(SP, Src);
Target->_and(SP, SP, T7); Target->_and(SP, SP, T7);
Target->getContext().insert<InstFakeUse>(SP);
} }
InstMIPS32Call *TargetMIPS32::Sandboxer::jal(Variable *ReturnReg, InstMIPS32Call *TargetMIPS32::Sandboxer::jal(Variable *ReturnReg,
Operand *CallTarget) { Operand *CallTarget) {
if (Target->NeedSandboxing) if (Target->NeedSandboxing) {
createAutoBundle(); createAutoBundle();
if (auto *CallTargetR = llvm::dyn_cast<Variable>(CallTarget)) {
Variable *T6 = Target->getPhysicalRegister(RegMIPS32::Reg_T6);
Target->_and(CallTargetR, CallTargetR, T6);
}
}
return Target->Context.insert<InstMIPS32Call>(ReturnReg, CallTarget); return Target->Context.insert<InstMIPS32Call>(ReturnReg, CallTarget);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment