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:
Bin Lu
2020-06-04 21:48:21 -04:00
parent 8e2c5d951e
commit 6acd185bd3
2 changed files with 18 additions and 0 deletions
+3
View File
@@ -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
+15
View File
@@ -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)
}
}
}