forked from tinygo-org/go-llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
26 changed files
with
4,153 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
//===- IRBindings.cpp - Additional bindings for ir ------------------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines additional C bindings for the ir component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "IRBindings.h" | ||
#include "llvm/IR/Attributes.h" | ||
#include "llvm/IR/DebugLoc.h" | ||
#include "llvm/IR/DebugInfoMetadata.h" | ||
#include "llvm/IR/Function.h" | ||
#include "llvm/IR/IRBuilder.h" | ||
#include "llvm/IR/LLVMContext.h" | ||
#include "llvm/IR/Module.h" | ||
|
||
using namespace llvm; | ||
|
||
LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef C) { | ||
return wrap(ConstantAsMetadata::get(unwrap<Constant>(C))); | ||
} | ||
|
||
LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen) { | ||
return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen))); | ||
} | ||
|
||
LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs, | ||
unsigned Count) { | ||
return wrap( | ||
MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count))); | ||
} | ||
|
||
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name, | ||
LLVMMetadataRef Val) { | ||
NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name); | ||
if (!N) | ||
return; | ||
if (!Val) | ||
return; | ||
N->addOperand(unwrap<MDNode>(Val)); | ||
} | ||
|
||
void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) { | ||
MDNode *N = MD ? unwrap<MDNode>(MD) : nullptr; | ||
unwrap<Instruction>(Inst)->setMetadata(KindID, N); | ||
} | ||
|
||
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line, | ||
unsigned Col, LLVMMetadataRef Scope, | ||
LLVMMetadataRef InlinedAt) { | ||
unwrap(Bref)->SetCurrentDebugLocation( | ||
DebugLoc::get(Line, Col, Scope ? unwrap<MDNode>(Scope) : nullptr, | ||
InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr)); | ||
} | ||
|
||
LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref) { | ||
const auto& Loc = unwrap(Bref)->getCurrentDebugLocation(); | ||
const auto* InlinedAt = Loc.getInlinedAt(); | ||
const LLVMDebugLocMetadata md{ | ||
Loc.getLine(), | ||
Loc.getCol(), | ||
wrap(Loc.getScope()), | ||
InlinedAt == nullptr ? nullptr : wrap(InlinedAt->getRawInlinedAt()), | ||
}; | ||
return md; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
//===- IRBindings.h - Additional bindings for IR ----------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines additional C bindings for the IR component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_BINDINGS_GO_LLVM_IRBINDINGS_H | ||
#define LLVM_BINDINGS_GO_LLVM_IRBINDINGS_H | ||
|
||
#include "llvm-c/Core.h" | ||
#include "llvm-c/DebugInfo.h" | ||
#ifdef __cplusplus | ||
#include "llvm/IR/Metadata.h" | ||
#include "llvm/Support/CBindingWrapping.h" | ||
#endif | ||
|
||
#include <stdint.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
struct LLVMDebugLocMetadata{ | ||
unsigned Line; | ||
unsigned Col; | ||
LLVMMetadataRef Scope; | ||
LLVMMetadataRef InlinedAt; | ||
}; | ||
|
||
LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef Val); | ||
|
||
LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen); | ||
LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs, | ||
unsigned Count); | ||
|
||
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name, | ||
LLVMMetadataRef Val); | ||
void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD); | ||
|
||
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line, | ||
unsigned Col, LLVMMetadataRef Scope, | ||
LLVMMetadataRef InlinedAt); | ||
|
||
struct LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref); | ||
|
||
#ifdef __cplusplus | ||
} | ||
|
||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
//===- InstrumentationBindings.cpp - instrumentation bindings -------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines C bindings for the instrumentation component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "InstrumentationBindings.h" | ||
#include "llvm-c/Core.h" | ||
#include "llvm/IR/LegacyPassManager.h" | ||
#include "llvm/IR/Module.h" | ||
#include "llvm/Transforms/Instrumentation.h" | ||
|
||
using namespace llvm; | ||
|
||
void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM) { | ||
unwrap(PM)->add(createAddressSanitizerFunctionPass()); | ||
} | ||
|
||
void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM) { | ||
unwrap(PM)->add(createAddressSanitizerModulePass()); | ||
} | ||
|
||
void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM) { | ||
unwrap(PM)->add(createThreadSanitizerPass()); | ||
} | ||
|
||
void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM) { | ||
unwrap(PM)->add(createMemorySanitizerPass()); | ||
} | ||
|
||
void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, | ||
int ABIListFilesNum, | ||
const char **ABIListFiles) { | ||
std::vector<std::string> ABIListFilesVec; | ||
for (int i = 0; i != ABIListFilesNum; ++i) { | ||
ABIListFilesVec.push_back(ABIListFiles[i]); | ||
} | ||
unwrap(PM)->add(createDataFlowSanitizerPass(ABIListFilesVec)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
//===- InstrumentationBindings.h - instrumentation bindings -----*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines C bindings for the Transforms/Instrumentation component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_BINDINGS_GO_LLVM_INSTRUMENTATIONBINDINGS_H | ||
#define LLVM_BINDINGS_GO_LLVM_INSTRUMENTATIONBINDINGS_H | ||
|
||
#include "llvm-c/Core.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
// FIXME: These bindings shouldn't be Go-specific and should eventually move to | ||
// a (somewhat) less stable collection of C APIs for use in creating bindings of | ||
// LLVM in other languages. | ||
|
||
void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM); | ||
void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM); | ||
void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM); | ||
void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM); | ||
void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, int ABIListFilesNum, | ||
const char **ABIListFiles); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
//===- SupportBindings.cpp - Additional bindings for support --------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines additional C bindings for the support component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "SupportBindings.h" | ||
#include "llvm/Support/DynamicLibrary.h" | ||
#include <stdlib.h> | ||
#include <string.h> | ||
|
||
void LLVMLoadLibraryPermanently2(const char *Filename, char **ErrMsg) { | ||
std::string ErrMsgStr; | ||
if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Filename, &ErrMsgStr)) { | ||
*ErrMsg = static_cast<char *>(malloc(ErrMsgStr.size() + 1)); | ||
memcpy(static_cast<void *>(*ErrMsg), | ||
static_cast<const void *>(ErrMsgStr.c_str()), ErrMsgStr.size() + 1); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
//===- SupportBindings.h - Additional bindings for Support ------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines additional C bindings for the Support component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_BINDINGS_GO_LLVM_SUPPORTBINDINGS_H | ||
#define LLVM_BINDINGS_GO_LLVM_SUPPORTBINDINGS_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
// This function duplicates the LLVMLoadLibraryPermanently function in the | ||
// stable C API and adds an extra ErrMsg parameter to retrieve the error | ||
// message. | ||
void LLVMLoadLibraryPermanently2(const char *Filename, char **ErrMsg); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
//===- analysis.go - Bindings for analysis --------------------------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines bindings for the analysis component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
package llvm | ||
|
||
/* | ||
#include "llvm-c/Analysis.h" // If you are getting an error here read bindings/go/README.txt | ||
#include "llvm-c/Core.h" | ||
#include <stdlib.h> | ||
*/ | ||
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) } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
//===- bitreader.go - Bindings for bitreader ------------------------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines bindings for the bitreader component. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
package llvm | ||
|
||
/* | ||
#include "llvm-c/BitReader.h" | ||
#include "llvm-c/Core.h" | ||
#include <stdlib.h> | ||
*/ | ||
import "C" | ||
|
||
import ( | ||
"errors" | ||
"unsafe" | ||
) | ||
|
||
// ParseBitcodeFile parses the LLVM IR (bitcode) in the file with the | ||
// specified name, and returns a new LLVM module. | ||
func ParseBitcodeFile(name string) (Module, error) { | ||
var buf C.LLVMMemoryBufferRef | ||
var errmsg *C.char | ||
var cfilename *C.char = C.CString(name) | ||
defer C.free(unsafe.Pointer(cfilename)) | ||
result := C.LLVMCreateMemoryBufferWithContentsOfFile(cfilename, &buf, &errmsg) | ||
if result != 0 { | ||
err := errors.New(C.GoString(errmsg)) | ||
C.free(unsafe.Pointer(errmsg)) | ||
return Module{}, err | ||
} | ||
defer C.LLVMDisposeMemoryBuffer(buf) | ||
|
||
var m Module | ||
if C.LLVMParseBitcode2(buf, &m.C) == 0 { | ||
return m, nil | ||
} | ||
|
||
err := errors.New(C.GoString(errmsg)) | ||
C.free(unsafe.Pointer(errmsg)) | ||
return Module{}, err | ||
} |
Oops, something went wrong.