github.com/bytedance/mockey@v1.2.10/internal/tool/check_gcflags_amd64.go (about) 1 /* 2 * Copyright 2022 ByteDance Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package tool 18 19 import ( 20 "reflect" 21 "unsafe" 22 23 "golang.org/x/arch/x86/x86asm" 24 ) 25 26 func fn() { 27 } 28 29 func fn2() { 30 fn() 31 } 32 33 func IsGCFlagsSet() bool { 34 var asm []byte 35 header := (*reflect.SliceHeader)(unsafe.Pointer(&asm)) 36 header.Data = reflect.ValueOf(fn2).Pointer() 37 header.Len = 1000 38 header.Cap = 1000 39 40 flag := false 41 pos := 0 42 for pos < len(asm) { 43 inst, _ := x86asm.Decode(asm[pos:], 64) 44 if inst.Op == x86asm.RET { 45 break 46 } 47 if inst.Op == x86asm.CALL { 48 flag = true 49 break 50 } 51 pos += int(inst.Len) 52 } 53 return flag 54 }