diff options
Diffstat (limited to 'bindings/go')
-rw-r--r-- | bindings/go/llvm/DIBuilderBindings.cpp | 131 | ||||
-rw-r--r-- | bindings/go/llvm/DIBuilderBindings.h | 7 | ||||
-rw-r--r-- | bindings/go/llvm/IRBindings.cpp | 10 | ||||
-rw-r--r-- | bindings/go/llvm/InstrumentationBindings.cpp | 12 | ||||
-rw-r--r-- | bindings/go/llvm/InstrumentationBindings.h | 4 | ||||
-rw-r--r-- | bindings/go/llvm/SupportBindings.cpp | 1 | ||||
-rw-r--r-- | bindings/go/llvm/dibuilder.go | 32 | ||||
-rw-r--r-- | bindings/go/llvm/linker.go | 11 | ||||
-rw-r--r-- | bindings/go/llvm/transforms_instrumentation.go | 11 |
9 files changed, 128 insertions, 91 deletions
diff --git a/bindings/go/llvm/DIBuilderBindings.cpp b/bindings/go/llvm/DIBuilderBindings.cpp index 5671866d4d09b..df5885de25c49 100644 --- a/bindings/go/llvm/DIBuilderBindings.cpp +++ b/bindings/go/llvm/DIBuilderBindings.cpp @@ -12,22 +12,15 @@ //===----------------------------------------------------------------------===// #include "DIBuilderBindings.h" - #include "IRBindings.h" +#include "llvm/IR/DIBuilder.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Module.h" -#include "llvm/IR/DIBuilder.h" using namespace llvm; DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBuilder, LLVMDIBuilderRef) -namespace { -template <typename T> T unwrapDI(LLVMMetadataRef v) { - return v ? T(unwrap<MDNode>(v)) : T(); -} -} - LLVMDIBuilderRef LLVMNewDIBuilder(LLVMModuleRef mref) { Module *m = unwrap(mref); return wrap(new DIBuilder(*m)); @@ -47,16 +40,14 @@ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef Dref, int Optimized, const char *Flags, unsigned RuntimeVersion) { DIBuilder *D = unwrap(Dref); - DICompileUnit CU = D->createCompileUnit(Lang, File, Dir, Producer, Optimized, - Flags, RuntimeVersion); - return wrap(CU); + return wrap(D->createCompileUnit(Lang, File, Dir, Producer, Optimized, Flags, + RuntimeVersion)); } LLVMMetadataRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef Dref, const char *File, const char *Dir) { DIBuilder *D = unwrap(Dref); - DIFile F = D->createFile(File, Dir); - return wrap(F); + return wrap(D->createFile(File, Dir)); } LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Dref, @@ -65,8 +56,8 @@ LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Dref, unsigned Line, unsigned Column) { DIBuilder *D = unwrap(Dref); - DILexicalBlock LB = D->createLexicalBlock( - unwrapDI<DIDescriptor>(Scope), unwrapDI<DIFile>(File), Line, Column); + auto *LB = D->createLexicalBlock(unwrap<DILocalScope>(Scope), + unwrap<DIFile>(File), Line, Column); return wrap(LB); } @@ -75,9 +66,8 @@ LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Dref, LLVMMetadataRef File, unsigned Discriminator) { DIBuilder *D = unwrap(Dref); - DILexicalBlockFile LBF = D->createLexicalBlockFile( - unwrapDI<DIDescriptor>(Scope), unwrapDI<DIFile>(File), Discriminator); - return wrap(LBF); + return wrap(D->createLexicalBlockFile(unwrap<DILocalScope>(Scope), + unwrap<DIFile>(File), Discriminator)); } LLVMMetadataRef LLVMDIBuilderCreateFunction( @@ -86,11 +76,11 @@ LLVMMetadataRef LLVMDIBuilderCreateFunction( LLVMMetadataRef CompositeType, int IsLocalToUnit, int IsDefinition, unsigned ScopeLine, unsigned Flags, int IsOptimized, LLVMValueRef Func) { DIBuilder *D = unwrap(Dref); - DISubprogram SP = D->createFunction( - unwrapDI<DIDescriptor>(Scope), Name, LinkageName, unwrapDI<DIFile>(File), - Line, unwrapDI<DICompositeType>(CompositeType), IsLocalToUnit, - IsDefinition, ScopeLine, Flags, IsOptimized, unwrap<Function>(Func)); - return wrap(SP); + return wrap(D->createFunction(unwrap<DIScope>(Scope), Name, LinkageName, + File ? unwrap<DIFile>(File) : nullptr, Line, + unwrap<DISubroutineType>(CompositeType), + IsLocalToUnit, IsDefinition, ScopeLine, Flags, + IsOptimized, unwrap<Function>(Func))); } LLVMMetadataRef LLVMDIBuilderCreateLocalVariable( @@ -98,10 +88,9 @@ LLVMMetadataRef LLVMDIBuilderCreateLocalVariable( const char *Name, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef Ty, int AlwaysPreserve, unsigned Flags, unsigned ArgNo) { DIBuilder *D = unwrap(Dref); - DIVariable V = D->createLocalVariable( - Tag, unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line, - unwrapDI<DIType>(Ty), AlwaysPreserve, Flags, ArgNo); - return wrap(V); + return wrap(D->createLocalVariable( + Tag, unwrap<DIScope>(Scope), Name, unwrap<DIFile>(File), Line, + unwrap<DIType>(Ty), AlwaysPreserve, Flags, ArgNo)); } LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Dref, @@ -110,8 +99,7 @@ LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Dref, uint64_t AlignInBits, unsigned Encoding) { DIBuilder *D = unwrap(Dref); - DIBasicType T = D->createBasicType(Name, SizeInBits, AlignInBits, Encoding); - return wrap(T); + return wrap(D->createBasicType(Name, SizeInBits, AlignInBits, Encoding)); } LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Dref, @@ -120,18 +108,17 @@ LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Dref, uint64_t AlignInBits, const char *Name) { DIBuilder *D = unwrap(Dref); - DIDerivedType T = D->createPointerType(unwrapDI<DIType>(PointeeType), - SizeInBits, AlignInBits, Name); - return wrap(T); + return wrap(D->createPointerType(unwrap<DIType>(PointeeType), SizeInBits, + AlignInBits, Name)); } LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Dref, LLVMMetadataRef File, LLVMMetadataRef ParameterTypes) { DIBuilder *D = unwrap(Dref); - DICompositeType CT = D->createSubroutineType( - unwrapDI<DIFile>(File), unwrapDI<DITypeArray>(ParameterTypes)); - return wrap(CT); + return wrap( + D->createSubroutineType(File ? unwrap<DIFile>(File) : nullptr, + DITypeRefArray(unwrap<MDTuple>(ParameterTypes)))); } LLVMMetadataRef LLVMDIBuilderCreateStructType( @@ -140,11 +127,22 @@ LLVMMetadataRef LLVMDIBuilderCreateStructType( uint64_t AlignInBits, unsigned Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef ElementTypes) { DIBuilder *D = unwrap(Dref); - DICompositeType CT = D->createStructType( - unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line, - SizeInBits, AlignInBits, Flags, unwrapDI<DIType>(DerivedFrom), - unwrapDI<DIArray>(ElementTypes)); - return wrap(CT); + return wrap(D->createStructType( + unwrap<DIScope>(Scope), Name, File ? unwrap<DIFile>(File) : nullptr, Line, + SizeInBits, AlignInBits, Flags, + DerivedFrom ? unwrap<DIType>(DerivedFrom) : nullptr, + ElementTypes ? DINodeArray(unwrap<MDTuple>(ElementTypes)) : nullptr)); +} + +LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType( + LLVMDIBuilderRef Dref, unsigned Tag, const char *Name, + LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, + unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits, + unsigned Flags) { + DIBuilder *D = unwrap(Dref); + return wrap(D->createReplaceableCompositeType( + Tag, Name, unwrap<DIScope>(Scope), File ? unwrap<DIFile>(File) : nullptr, + Line, RuntimeLang, SizeInBits, AlignInBits, Flags)); } LLVMMetadataRef @@ -154,10 +152,9 @@ LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Dref, LLVMMetadataRef Scope, uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, LLVMMetadataRef Ty) { DIBuilder *D = unwrap(Dref); - DIDerivedType DT = D->createMemberType( - unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line, - SizeInBits, AlignInBits, OffsetInBits, Flags, unwrapDI<DIType>(Ty)); - return wrap(DT); + return wrap(D->createMemberType( + unwrap<DIScope>(Scope), Name, File ? unwrap<DIFile>(File) : nullptr, Line, + SizeInBits, AlignInBits, OffsetInBits, Flags, unwrap<DIType>(Ty))); } LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Dref, @@ -166,10 +163,9 @@ LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Dref, LLVMMetadataRef ElementType, LLVMMetadataRef Subscripts) { DIBuilder *D = unwrap(Dref); - DICompositeType CT = - D->createArrayType(SizeInBits, AlignInBits, unwrapDI<DIType>(ElementType), - unwrapDI<DIArray>(Subscripts)); - return wrap(CT); + return wrap(D->createArrayType(SizeInBits, AlignInBits, + unwrap<DIType>(ElementType), + DINodeArray(unwrap<MDTuple>(Subscripts)))); } LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Dref, @@ -177,17 +173,15 @@ LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Dref, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef Context) { DIBuilder *D = unwrap(Dref); - DIDerivedType DT = - D->createTypedef(unwrapDI<DIType>(Ty), Name, unwrapDI<DIFile>(File), Line, - unwrapDI<DIDescriptor>(Context)); - return wrap(DT); + return wrap(D->createTypedef(unwrap<DIType>(Ty), Name, + File ? unwrap<DIFile>(File) : nullptr, Line, + Context ? unwrap<DIScope>(Context) : nullptr)); } LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Dref, int64_t Lo, int64_t Count) { DIBuilder *D = unwrap(Dref); - DISubrange S = D->getOrCreateSubrange(Lo, Count); - return wrap(S); + return wrap(D->getOrCreateSubrange(Lo, Count)); } LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Dref, @@ -196,8 +190,8 @@ LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Dref, DIBuilder *D = unwrap(Dref); Metadata **DataValue = unwrap(Data); ArrayRef<Metadata *> Elements(DataValue, Length); - DIArray A = D->getOrCreateArray(Elements); - return wrap(A); + DINodeArray A = D->getOrCreateArray(Elements); + return wrap(A.get()); } LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Dref, @@ -206,15 +200,14 @@ LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Dref, DIBuilder *D = unwrap(Dref); Metadata **DataValue = unwrap(Data); ArrayRef<Metadata *> Elements(DataValue, Length); - DITypeArray A = D->getOrCreateTypeArray(Elements); - return wrap(A); + DITypeRefArray A = D->getOrCreateTypeArray(Elements); + return wrap(A.get()); } LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Dref, int64_t *Addr, size_t Length) { DIBuilder *D = unwrap(Dref); - DIExpression Expr = D->createExpression(ArrayRef<int64_t>(Addr, Length)); - return wrap(Expr); + return wrap(D->createExpression(ArrayRef<int64_t>(Addr, Length))); } LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd(LLVMDIBuilderRef Dref, @@ -222,10 +215,14 @@ LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd(LLVMDIBuilderRef Dref, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMBasicBlockRef Block) { + // Fail immediately here until the llgo folks update their bindings. The + // called function is going to assert out anyway. + llvm_unreachable("DIBuilder API change requires a DebugLoc"); + DIBuilder *D = unwrap(Dref); - Instruction *Instr = - D->insertDeclare(unwrap(Storage), unwrapDI<DIVariable>(VarInfo), - unwrapDI<DIExpression>(Expr), unwrap(Block)); + Instruction *Instr = D->insertDeclare( + unwrap(Storage), unwrap<DILocalVariable>(VarInfo), + unwrap<DIExpression>(Expr), /* DebugLoc */ nullptr, unwrap(Block)); return wrap(Instr); } @@ -234,9 +231,13 @@ LLVMValueRef LLVMDIBuilderInsertValueAtEnd(LLVMDIBuilderRef Dref, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMBasicBlockRef Block) { + // Fail immediately here until the llgo folks update their bindings. The + // called function is going to assert out anyway. + llvm_unreachable("DIBuilder API change requires a DebugLoc"); + DIBuilder *D = unwrap(Dref); Instruction *Instr = D->insertDbgValueIntrinsic( - unwrap(Val), Offset, unwrapDI<DIVariable>(VarInfo), - unwrapDI<DIExpression>(Expr), unwrap(Block)); + unwrap(Val), Offset, unwrap<DILocalVariable>(VarInfo), + unwrap<DIExpression>(Expr), /* DebugLoc */ nullptr, unwrap(Block)); return wrap(Instr); } diff --git a/bindings/go/llvm/DIBuilderBindings.h b/bindings/go/llvm/DIBuilderBindings.h index 8a8ce3f6e7bb0..a4fba2784185b 100644 --- a/bindings/go/llvm/DIBuilderBindings.h +++ b/bindings/go/llvm/DIBuilderBindings.h @@ -14,8 +14,8 @@ #ifndef LLVM_BINDINGS_GO_LLVM_DIBUILDERBINDINGS_H #define LLVM_BINDINGS_GO_LLVM_DIBUILDERBINDINGS_H -#include "llvm-c/Core.h" #include "IRBindings.h" +#include "llvm-c/Core.h" #ifdef __cplusplus extern "C" { @@ -84,6 +84,11 @@ LLVMMetadataRef LLVMDIBuilderCreateStructType( uint64_t AlignInBits, unsigned Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef ElementTypes); +LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType( + LLVMDIBuilderRef D, unsigned Tag, const char *Name, LLVMMetadataRef Scope, + LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, + uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags); + LLVMMetadataRef LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef D, LLVMMetadataRef Scope, const char *Name, LLVMMetadataRef File, diff --git a/bindings/go/llvm/IRBindings.cpp b/bindings/go/llvm/IRBindings.cpp index fac4126acda34..fd0cb8006a4fe 100644 --- a/bindings/go/llvm/IRBindings.cpp +++ b/bindings/go/llvm/IRBindings.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "IRBindings.h" - #include "llvm/IR/Attributes.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/Function.h" @@ -66,8 +65,9 @@ LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs, LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs, unsigned Count) { - return wrap(MDNode::getTemporary(*unwrap(C), - ArrayRef<Metadata *>(unwrap(MDs), Count))); + return wrap(MDTuple::getTemporary(*unwrap(C), + ArrayRef<Metadata *>(unwrap(MDs), Count)) + .release()); } void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name, @@ -86,8 +86,8 @@ void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) { } void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) { - auto *Node = unwrap<MDNodeFwdDecl>(MD); - Node->replaceAllUsesWith(unwrap<MDNode>(New)); + auto *Node = unwrap<MDNode>(MD); + Node->replaceAllUsesWith(unwrap<Metadata>(New)); MDNode::deleteTemporary(Node); } diff --git a/bindings/go/llvm/InstrumentationBindings.cpp b/bindings/go/llvm/InstrumentationBindings.cpp index b604abb5c7076..8b7bafa77ad4c 100644 --- a/bindings/go/llvm/InstrumentationBindings.cpp +++ b/bindings/go/llvm/InstrumentationBindings.cpp @@ -12,10 +12,9 @@ //===----------------------------------------------------------------------===// #include "InstrumentationBindings.h" - #include "llvm-c/Core.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" -#include "llvm/PassManager.h" #include "llvm/Transforms/Instrumentation.h" using namespace llvm; @@ -37,6 +36,11 @@ void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM) { } void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, - const char *ABIListFile) { - unwrap(PM)->add(createDataFlowSanitizerPass(ABIListFile)); + 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)); } diff --git a/bindings/go/llvm/InstrumentationBindings.h b/bindings/go/llvm/InstrumentationBindings.h index e8dbd59e43127..97af2d58c2714 100644 --- a/bindings/go/llvm/InstrumentationBindings.h +++ b/bindings/go/llvm/InstrumentationBindings.h @@ -28,8 +28,8 @@ void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM); void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM); void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM); void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM); -void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, - const char *ABIListFile); +void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, int ABIListFilesNum, + const char **ABIListFiles); #ifdef __cplusplus } diff --git a/bindings/go/llvm/SupportBindings.cpp b/bindings/go/llvm/SupportBindings.cpp index df5f86557560a..5e251b7da0923 100644 --- a/bindings/go/llvm/SupportBindings.cpp +++ b/bindings/go/llvm/SupportBindings.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "SupportBindings.h" - #include "llvm/Support/DynamicLibrary.h" #include <stdlib.h> #include <string.h> diff --git a/bindings/go/llvm/dibuilder.go b/bindings/go/llvm/dibuilder.go index 3b1a1a645451f..f03f740b77700 100644 --- a/bindings/go/llvm/dibuilder.go +++ b/bindings/go/llvm/dibuilder.go @@ -343,6 +343,38 @@ func (d *DIBuilder) CreateStructType(scope Metadata, t DIStructType) Metadata { return Metadata{C: result} } +// DIReplaceableCompositeType holds the values for creating replaceable +// composite type debug metadata. +type DIReplaceableCompositeType struct { + Tag dwarf.Tag + Name string + File Metadata + Line int + RuntimeLang int + SizeInBits uint64 + AlignInBits uint64 + Flags int +} + +// CreateReplaceableCompositeType creates replaceable composite type debug metadata. +func (d *DIBuilder) CreateReplaceableCompositeType(scope Metadata, t DIReplaceableCompositeType) Metadata { + name := C.CString(t.Name) + defer C.free(unsafe.Pointer(name)) + result := C.LLVMDIBuilderCreateReplaceableCompositeType( + d.ref, + C.unsigned(t.Tag), + name, + scope.C, + t.File.C, + C.unsigned(t.Line), + C.unsigned(t.RuntimeLang), + C.uint64_t(t.SizeInBits), + C.uint64_t(t.AlignInBits), + C.unsigned(t.Flags), + ) + return Metadata{C: result} +} + // DIMemberType holds the values for creating member type debug metadata. type DIMemberType struct { Name string diff --git a/bindings/go/llvm/linker.go b/bindings/go/llvm/linker.go index 31e9ad24bf528..f64f66c858e8a 100644 --- a/bindings/go/llvm/linker.go +++ b/bindings/go/llvm/linker.go @@ -20,16 +20,9 @@ package llvm import "C" import "errors" -type LinkerMode C.LLVMLinkerMode - -const ( - LinkerDestroySource = C.LLVMLinkerDestroySource - LinkerPreserveSource = C.LLVMLinkerPreserveSource -) - -func LinkModules(Dest, Src Module, Mode LinkerMode) error { +func LinkModules(Dest, Src Module) error { var cmsg *C.char - failed := C.LLVMLinkModules(Dest.C, Src.C, C.LLVMLinkerMode(Mode), &cmsg) + failed := C.LLVMLinkModules(Dest.C, Src.C, C.LLVMLinkerDestroySource, &cmsg) if failed != 0 { err := errors.New(C.GoString(cmsg)) C.LLVMDisposeMessage(cmsg) diff --git a/bindings/go/llvm/transforms_instrumentation.go b/bindings/go/llvm/transforms_instrumentation.go index 9b191b26693b6..73e2732cbd955 100644 --- a/bindings/go/llvm/transforms_instrumentation.go +++ b/bindings/go/llvm/transforms_instrumentation.go @@ -36,8 +36,11 @@ func (pm PassManager) AddMemorySanitizerPass() { C.LLVMAddMemorySanitizerPass(pm.C) } -func (pm PassManager) AddDataFlowSanitizerPass(abilist string) { - cabilist := C.CString(abilist) - defer C.free(unsafe.Pointer(cabilist)) - C.LLVMAddDataFlowSanitizerPass(pm.C, cabilist) +func (pm PassManager) AddDataFlowSanitizerPass(abilist []string) { + abiliststrs := make([]*C.char, len(abilist)) + for i, arg := range abilist { + abiliststrs[i] = C.CString(arg) + defer C.free(unsafe.Pointer(abiliststrs[i])) + } + C.LLVMAddDataFlowSanitizerPass(pm.C, C.int(len(abilist)), &abiliststrs[0]) } |