MIPSR6: Load full address to t9 when calling PIC code
PIC code requires that full function address is available in t9 upon function entry. We disabled some optimizations that cause problems since they do not load t9 with full function address. Bug: Change-Id: Ie7987c5e2413db04c59547c33a69696e19db4b34 Reviewed-on: https://chromium-review.googlesource.com/806494 Reviewed-by: Miran Karić <miran.karic@mips.com> Commit-Queue: Ivica Bogosavljevic <ivica.bogosavljevic@mips.com> Cr-Commit-Position: refs/heads/master@{#49835}
This commit is contained in:
parent
104a2db3c7
commit
f119c09769
@ -5127,20 +5127,11 @@ void TurboAssembler::PrepareCallCFunction(int num_reg_arguments,
|
||||
void TurboAssembler::CallCFunction(ExternalReference function,
|
||||
int num_reg_arguments,
|
||||
int num_double_arguments) {
|
||||
if (IsMipsArchVariant(kMips32r6)) {
|
||||
uint32_t lui_offset, jialc_offset;
|
||||
UnpackTargetAddressUnsigned(Operand(function).immediate(), lui_offset,
|
||||
jialc_offset);
|
||||
if (MustUseReg(Operand(function).rmode())) {
|
||||
RecordRelocInfo(Operand(function).rmode(), Operand(function).immediate());
|
||||
}
|
||||
lui(t9, lui_offset);
|
||||
CallCFunctionHelper(t9, jialc_offset, num_reg_arguments,
|
||||
num_double_arguments);
|
||||
} else {
|
||||
li(t9, Operand(function));
|
||||
CallCFunctionHelper(t9, 0, num_reg_arguments, num_double_arguments);
|
||||
}
|
||||
// Linux/MIPS convention demands that register t9 contains
|
||||
// the address of the function being call in case of
|
||||
// Position independent code
|
||||
li(t9, Operand(function));
|
||||
CallCFunctionHelper(t9, 0, num_reg_arguments, num_double_arguments);
|
||||
}
|
||||
|
||||
void TurboAssembler::CallCFunction(Register function, int num_reg_arguments,
|
||||
@ -5197,6 +5188,11 @@ void TurboAssembler::CallCFunctionHelper(Register function_base,
|
||||
function_base = t9;
|
||||
}
|
||||
|
||||
if (function_offset != 0) {
|
||||
addiu(t9, t9, function_offset);
|
||||
function_offset = 0;
|
||||
}
|
||||
|
||||
Call(function_base, function_offset);
|
||||
|
||||
int stack_passed_arguments = CalculateStackPassedWords(
|
||||
|
Loading…
Reference in New Issue
Block a user