mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
avoid runtime fails with missing stack maps in race mode on Arm64
In race mode, when calling the go function in asm code, there will be an missing stack maps issue. The root cause is: The function of 'muldiv64' has a non-empty frame, so it needs stack maps for locals, for which the macro NO_LOCAL_POINTERS will do. Also, the macro GO_ARGS can covers arguments. Signed-off-by: Bin Lu <bin.lu@arm.com>
This commit is contained in:
@@ -12,12 +12,15 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "funcdata.h"
|
||||
#include "textflag.h"
|
||||
|
||||
// Documentation is available in parameters.go.
|
||||
//
|
||||
// func muldiv64(value, multiplier, divisor uint64) (uint64, bool)
|
||||
TEXT ·muldiv64(SB),NOSPLIT,$40-33
|
||||
GO_ARGS
|
||||
NO_LOCAL_POINTERS
|
||||
MOVD value+0(FP), R0
|
||||
MOVD multiplier+8(FP), R1
|
||||
MOVD divisor+16(FP), R2
|
||||
|
||||
@@ -484,3 +484,18 @@ func TestMulDivOverflow(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkMuldiv64(b *testing.B) {
|
||||
var v uint64 = math.MaxUint64
|
||||
for i := uint64(1); i <= 1000000; i++ {
|
||||
mult := uint64(1000000000)
|
||||
div := i * mult
|
||||
res, ok := muldiv64(v, mult, div)
|
||||
if !ok {
|
||||
b.Errorf("Result of %v * %v / %v ok got false want true", v, mult, div)
|
||||
}
|
||||
if want := v / i; res != want {
|
||||
b.Errorf("Bad result of %v * %v / %v: got %v, want %v", v, mult, div, res, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user