//===- analysis.go - Bindings for analysis --------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines bindings for the analysis component. // //===----------------------------------------------------------------------===// package llvm /* #include "llvm-c/Analysis.h" // If you are getting an error here you need to build or install LLVM, see https://tinygo.org/docs/guides/build/ #include "llvm-c/Core.h" #include */ import "C" import "errors" type VerifierFailureAction C.LLVMVerifierFailureAction const ( // verifier will print to stderr and abort() AbortProcessAction VerifierFailureAction = C.LLVMAbortProcessAction // verifier will print to stderr and return 1 PrintMessageAction VerifierFailureAction = C.LLVMPrintMessageAction // verifier will just return 1 ReturnStatusAction VerifierFailureAction = C.LLVMReturnStatusAction ) // Verifies that a module is valid, taking the specified action if not. // Optionally returns a human-readable description of any invalid constructs. func VerifyModule(m Module, a VerifierFailureAction) error { var cmsg *C.char broken := C.LLVMVerifyModule(m.C, C.LLVMVerifierFailureAction(a), &cmsg) // C++'s verifyModule means isModuleBroken, so it returns false if // there are no errors if broken != 0 { err := errors.New(C.GoString(cmsg)) C.LLVMDisposeMessage(cmsg) return err } return nil } var verifyFunctionError = errors.New("Function is broken") // Verifies that a single function is valid, taking the specified action. // Useful for debugging. func VerifyFunction(f Value, a VerifierFailureAction) error { broken := C.LLVMVerifyFunction(f.C, C.LLVMVerifierFailureAction(a)) // C++'s verifyFunction means isFunctionBroken, so it returns false if // there are no errors if broken != 0 { return verifyFunctionError } return nil } // Open up a ghostview window that displays the CFG of the current function. // Useful for debugging. func ViewFunctionCFG(f Value) { C.LLVMViewFunctionCFG(f.C) } func ViewFunctionCFGOnly(f Value) { C.LLVMViewFunctionCFGOnly(f.C) }