+++ /dev/null
-Matthew Willis
+++ /dev/null
-USING: alien alien.c-types alien.libraries alien.syntax
-classes.struct combinators system unix.types ;
-IN: llvm.clang.ffi
-
-<<
-"libclang" {
- { [ os macosx? ] [ "libclang.dylib" ] }
- { [ os windows? ] [ "clang.dll" ] }
- { [ os unix? ] [ "/usrlibclang.so" ] }
-} cond cdecl add-library
->>
-LIBRARY: libclang
-
-C-TYPE: CXTranslationUnitImpl
-
-TYPEDEF: void* CXIndex
-TYPEDEF: CXTranslationUnitImpl* CXTranslationUnit
-TYPEDEF: void* CXClientData
-
-STRUCT: CXUnsavedFile
- { Filename c-string }
- { Contents c-string }
- { Length ulong } ;
-
-ENUM: CXAvailabilityKind
- CXAvailability_Available
- CXAvailability_Deprecated
- CXAvailability_NotAvailable ;
-
-STRUCT: CXString
- { data void* }
- { private_flags uint } ;
-
-FUNCTION: c-string clang_getCString ( CXString string ) ;
-FUNCTION: void clang_disposeString ( CXString string ) ;
-
-FUNCTION: CXIndex clang_createIndex ( int excludeDeclarationsFromPCH,
- int displayDiagnostics ) ;
-FUNCTION: void clang_disposeIndex ( CXIndex index ) ;
-
-TYPEDEF: void* CXFile
-
-FUNCTION: CXString clang_getFileName ( CXFile SFile ) ;
-FUNCTION: time_t clang_getFileTime ( CXFile SFile ) ;
-FUNCTION: uint clang_isFileMultipleIncludeGuarded ( CXTranslationUnit tu, CXFile file ) ;
-FUNCTION: CXFile clang_getFile ( CXTranslationUnit tu, c-string file_name ) ;
-
-STRUCT: CXSourceLocation
- { ptr_data void*[2] }
- { int_data uint } ;
-
-STRUCT: CXSourceRange
- { ptr_data void*[2] }
- { begin_int_data uint }
- { end_int_data uint } ;
-
-FUNCTION: CXSourceLocation clang_getNullLocation ( ) ;
-FUNCTION: uint clang_equalLocations ( CXSourceLocation loc1, CXSourceLocation loc2 ) ;
-
-FUNCTION: CXSourceLocation clang_getLocation ( CXTranslationUnit tu, CXFile file, uint line, uint column ) ;
-FUNCTION: CXSourceLocation clang_getLocationForOffset ( CXTranslationUnit tu,
- CXFile file,
- uint offset ) ;
-
-FUNCTION: CXSourceRange clang_getNullRange ( ) ;
-
-FUNCTION: CXSourceRange clang_getRange ( CXSourceLocation begin,
- CXSourceLocation end ) ;
-
-FUNCTION: void clang_getInstantiationLocation ( CXSourceLocation location,
- CXFile* file,
- uint* line,
- uint* column,
- uint* offset ) ;
-
-FUNCTION: void clang_getSpellingLocation ( CXSourceLocation location,
- CXFile* file,
- uint* line,
- uint* column,
- uint* offset ) ;
-
-FUNCTION: CXSourceLocation clang_getRangeStart ( CXSourceRange range ) ;
-FUNCTION: CXSourceLocation clang_getRangeEnd ( CXSourceRange range ) ;
-
-ENUM: CXDiagnosticSeverity
- CXDiagnostic_Ignored
- CXDiagnostic_Note
- CXDiagnostic_Warning
- CXDiagnostic_Error
- CXDiagnostic_Fatal ;
-
-TYPEDEF: void* CXDiagnostic
-
-FUNCTION: uint clang_getNumDiagnostics ( CXTranslationUnit Unit ) ;
-FUNCTION: CXDiagnostic clang_getDiagnostic ( CXTranslationUnit Unit,
- uint Index ) ;
-FUNCTION: void clang_disposeDiagnostic ( CXDiagnostic Diagnostic ) ;
-
-ENUM: CXDiagnosticDisplayOptions
- { CXDiagnostic_DisplaySourceLocation 0x01 }
- { CXDiagnostic_DisplayColumn 0x02 }
- { CXDiagnostic_DisplaySourceRanges 0x04 }
- { CXDiagnostic_DisplayOption 0x08 }
- { CXDiagnostic_DisplayCategoryId 0x10 }
- { CXDiagnostic_DisplayCategoryName 0x20 } ;
-
-FUNCTION: CXString clang_formatDiagnostic ( CXDiagnostic Diagnostic,
- uint Options ) ;
-FUNCTION: uint clang_defaultDiagnosticDisplayOptions ( ) ;
-
-FUNCTION: CXDiagnosticSeverity clang_getDiagnosticSeverity ( CXDiagnostic ) ;
-FUNCTION: CXSourceLocation clang_getDiagnosticLocation ( CXDiagnostic ) ;
-FUNCTION: CXString clang_getDiagnosticSpelling ( CXDiagnostic ) ;
-FUNCTION: CXString clang_getDiagnosticOption ( CXDiagnostic Diag, CXString* Disable ) ;
-FUNCTION: uint clang_getDiagnosticCategory ( CXDiagnostic ) ;
-FUNCTION: CXString clang_getDiagnosticCategoryName ( uint Category ) ;
-FUNCTION: uint clang_getDiagnosticNumRanges ( CXDiagnostic ) ;
-FUNCTION: CXSourceRange clang_getDiagnosticRange ( CXDiagnostic Diagnostic, uint Range ) ;
-FUNCTION: uint clang_getDiagnosticNumFixIts ( CXDiagnostic Diagnostic ) ;
-FUNCTION: CXString clang_getDiagnosticFixIt ( CXDiagnostic Diagnostic,
- uint FixIt,
- CXSourceRange* ReplacementRange ) ;
-FUNCTION: CXString clang_getTranslationUnitSpelling ( CXTranslationUnit CTUnit ) ;
-FUNCTION: CXTranslationUnit clang_createTranslationUnitFromSourceFile ( CXIndex CIdx,
- c-string source_filename,
- int num_clang_command_line_args,
- char** clang_command_line_args,
- uint num_unsaved_files,
- CXUnsavedFile* unsaved_files ) ;
-FUNCTION: CXTranslationUnit clang_createTranslationUnit ( CXIndex CIdx, c-string ast_filename ) ;
-
-ENUM: CXTranslationUnit_Flags
- { CXTranslationUnit_None 0x00 }
- { CXTranslationUnit_DetailedPreprocessingRecord 0x01 }
- { CXTranslationUnit_Incomplete 0x02 }
- { CXTranslationUnit_PrecompiledPreamble 0x04 }
- { CXTranslationUnit_CacheCompletionResults 0x08 }
- { CXTranslationUnit_CXXPrecompiledPreamble 0x10 }
- { CXTranslationUnit_CXXChainedPCH 0x20 }
- { CXTranslationUnit_NestedMacroInstantiations 0x40 } ;
-
-FUNCTION: uint clang_defaultEditingTranslationUnitOptions ( ) ;
-FUNCTION: CXTranslationUnit clang_parseTranslationUnit ( CXIndex CIdx,
- c-string source_filename,
- char** command_line_args,
- int num_command_line_args,
- CXUnsavedFile* unsaved_files,
- uint num_unsaved_files,
- uint options ) ;
-
-ENUM: CXSaveTranslationUnit_Flags CXSaveTranslationUnit_None ;
-
-FUNCTION: uint clang_defaultSaveOptions ( CXTranslationUnit TU ) ;
-FUNCTION: int clang_saveTranslationUnit ( CXTranslationUnit TU,
- c-string FileName,
- uint options ) ;
-FUNCTION: void clang_disposeTranslationUnit ( CXTranslationUnit ) ;
-
-ENUM: CXReparse_Flags CXReparse_None ;
-
-FUNCTION: uint clang_defaultReparseOptions ( CXTranslationUnit TU ) ;
-FUNCTION: int clang_reparseTranslationUnit ( CXTranslationUnit TU,
- uint num_unsaved_files,
- CXUnsavedFile* unsaved_files,
- uint options ) ;
-
-ENUM: CXTUResourceUsageKind
- { CXTUResourceUsage_AST 1 }
- { CXTUResourceUsage_Identifiers 2 }
- { CXTUResourceUsage_Selectors 3 }
- { CXTUResourceUsage_GlobalCompletionResults 4 }
- { CXTUResourceUsage_SourceManagerContentCache 5 }
- { CXTUResourceUsage_AST_SideTables 6 }
- { CXTUResourceUsage_SourceManager_Membuffer_Malloc 7 }
- { CXTUResourceUsage_SourceManager_Membuffer_MMap 8 }
- { CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc 9 }
- { CXTUResourceUsage_ExternalASTSource_Membuffer_MMap 10 }
- { CXTUResourceUsage_Preprocessor 11 }
- { CXTUResourceUsage_PreprocessingRecord 12 }
- { CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN 1 }
- { CXTUResourceUsage_MEMORY_IN_BYTES_END 12 }
- { CXTUResourceUsage_First 1 }
- { CXTUResourceUsage_Last 12 } ;
-
-FUNCTION: c-string clang_getTUResourceUsageName ( CXTUResourceUsageKind kind ) ;
-
-STRUCT: CXTUResourceUsageEntry
- { kind CXTUResourceUsageKind }
- { amount ulong } ;
-
-STRUCT: CXTUResourceUsage
- { data void* }
- { numEntries uint }
- { entries CXTUResourceUsageEntry* } ;
-
-FUNCTION: CXTUResourceUsage clang_getCXTUResourceUsage ( CXTranslationUnit TU ) ;
-FUNCTION: void clang_disposeCXTUResourceUsage ( CXTUResourceUsage usage ) ;
-
-ENUM: CXCursorKind
- { CXCursor_UnexposedDecl 1 }
- { CXCursor_StructDecl 2 }
- { CXCursor_UnionDecl 3 }
- { CXCursor_ClassDecl 4 }
- { CXCursor_EnumDecl 5 }
- { CXCursor_FieldDecl 6 }
- { CXCursor_EnumConstantDecl 7 }
- { CXCursor_FunctionDecl 8 }
- { CXCursor_VarDecl 9 }
- { CXCursor_ParmDecl 10 }
- { CXCursor_ObjCInterfaceDecl 11 }
- { CXCursor_ObjCCategoryDecl 12 }
- { CXCursor_ObjCProtocolDecl 13 }
- { CXCursor_ObjCPropertyDecl 14 }
- { CXCursor_ObjCIvarDecl 15 }
- { CXCursor_ObjCInstanceMethodDecl 16 }
- { CXCursor_ObjCClassMethodDecl 17 }
- { CXCursor_ObjCImplementationDecl 18 }
- { CXCursor_ObjCCategoryImplDecl 19 }
- { CXCursor_TypedefDecl 20 }
- { CXCursor_CXXMethod 21 }
- { CXCursor_Namespace 22 }
- { CXCursor_LinkageSpec 23 }
- { CXCursor_Constructor 24 }
- { CXCursor_Destructor 25 }
- { CXCursor_ConversionFunction 26 }
- { CXCursor_TemplateTypeParameter 27 }
- { CXCursor_NonTypeTemplateParameter 28 }
- { CXCursor_TemplateTemplateParameter 29 }
- { CXCursor_FunctionTemplate 30 }
- { CXCursor_ClassTemplate 31 }
- { CXCursor_ClassTemplatePartialSpecialization 32 }
- { CXCursor_NamespaceAlias 33 }
- { CXCursor_UsingDirective 34 }
- { CXCursor_UsingDeclaration 35 }
- { CXCursor_TypeAliasDecl 36 }
- { CXCursor_FirstDecl 1 }
- { CXCursor_LastDecl 36 }
- { CXCursor_FirstRef 40 }
- { CXCursor_ObjCSuperClassRef 40 }
- { CXCursor_ObjCProtocolRef 41 }
- { CXCursor_ObjCClassRef 42 }
- { CXCursor_TypeRef 43 }
- { CXCursor_CXXBaseSpecifier 44 }
- { CXCursor_TemplateRef 45 }
- { CXCursor_NamespaceRef 46 }
- { CXCursor_MemberRef 47 }
- { CXCursor_LabelRef 48 }
- { CXCursor_OverloadedDeclRef 49 }
- { CXCursor_LastRef 49 }
- { CXCursor_FirstInvalid 70 }
- { CXCursor_InvalidFile 70 }
- { CXCursor_NoDeclFound 71 }
- { CXCursor_NotImplemented 72 }
- { CXCursor_InvalidCode 73 }
- { CXCursor_LastInvalid 73 }
- { CXCursor_FirstExpr 100 }
- { CXCursor_UnexposedExpr 100 }
- { CXCursor_DeclRefExpr 101 }
- { CXCursor_MemberRefExpr 102 }
- { CXCursor_CallExpr 103 }
- { CXCursor_ObjCMessageExpr 104 }
- { CXCursor_BlockExpr 105 }
- { CXCursor_LastExpr 105 }
- { CXCursor_FirstStmt 200 }
- { CXCursor_UnexposedStmt 200 }
- { CXCursor_LabelStmt 201 }
- { CXCursor_LastStmt 201 }
- { CXCursor_TranslationUnit 300 }
- { CXCursor_FirstAttr 400 }
- { CXCursor_UnexposedAttr 400 }
- { CXCursor_IBActionAttr 401 }
- { CXCursor_IBOutletAttr 402 }
- { CXCursor_IBOutletCollectionAttr 403 }
- { CXCursor_LastAttr 403 }
- { CXCursor_PreprocessingDirective 500 }
- { CXCursor_MacroDefinition 501 }
- { CXCursor_MacroInstantiation 502 }
- { CXCursor_InclusionDirective 503 }
- { CXCursor_FirstPreprocessing 500 }
- { CXCursor_LastPreprocessing 503 } ;
-
-STRUCT: CXCursor
- { kind CXCursorKind }
- { data void*[3] } ;
-
-FUNCTION: CXCursor clang_getNullCursor ( ) ;
-FUNCTION: CXCursor clang_getTranslationUnitCursor ( CXTranslationUnit ) ;
-FUNCTION: uint clang_equalCursors ( CXCursor c1, CXCursor c2 ) ;
-FUNCTION: uint clang_hashCursor ( CXCursor ) ;
-FUNCTION: CXCursorKind clang_getCursorKind ( CXCursor ) ;
-FUNCTION: uint clang_isDeclaration ( CXCursorKind ) ;
-FUNCTION: uint clang_isReference ( CXCursorKind ) ;
-FUNCTION: uint clang_isExpression ( CXCursorKind ) ;
-FUNCTION: uint clang_isStatement ( CXCursorKind ) ;
-FUNCTION: uint clang_isInvalid ( CXCursorKind ) ;
-FUNCTION: uint clang_isTranslationUnit ( CXCursorKind ) ;
-FUNCTION: uint clang_isPreprocessing ( CXCursorKind ) ;
-FUNCTION: uint clang_isUnexposed ( CXCursorKind ) ;
-
-ENUM: CXLinkageKind
- CXLinkage_Invalid
- CXLinkage_NoLinkage
- CXLinkage_Internal
- CXLinkage_UniqueExternal
- CXLinkage_External ;
-
-ENUM: CXLanguageKind
- CXLanguage_Invalid
- CXLanguage_C
- CXLanguage_ObjC
- CXLanguage_CPlusPlus ;
-
-FUNCTION: CXLinkageKind clang_getCursorLinkage ( CXCursor cursor ) ;
-FUNCTION: CXAvailabilityKind clang_getCursorAvailability ( CXCursor cursor ) ;
-FUNCTION: CXLanguageKind clang_getCursorLanguage ( CXCursor cursor ) ;
-
-C-TYPE: CXCursorSetImpl
-TYPEDEF: CXCursorSetImpl* CXCursorSet
-
-FUNCTION: CXCursorSet clang_createCXCursorSet ( ) ;
-FUNCTION: void clang_disposeCXCursorSet ( CXCursorSet cset ) ;
-FUNCTION: uint clang_CXCursorSet_contains ( CXCursorSet cset, CXCursor cursor ) ;
-FUNCTION: uint clang_CXCursorSet_insert ( CXCursorSet cset, CXCursor cursor ) ;
-FUNCTION: CXCursor clang_getCursorSemanticParent ( CXCursor cursor ) ;
-FUNCTION: CXCursor clang_getCursorLexicalParent ( CXCursor cursor ) ;
-FUNCTION: void clang_getOverriddenCursors ( CXCursor cursor, CXCursor** overridden, uint* num_overridden ) ;
-FUNCTION: void clang_disposeOverriddenCursors ( CXCursor* overridden ) ;
-FUNCTION: CXFile clang_getIncludedFile ( CXCursor cursor ) ;
-FUNCTION: CXCursor clang_getCursor ( CXTranslationUnit TU,
- CXSourceLocation location ) ;
-FUNCTION: CXSourceLocation clang_getCursorLocation ( CXCursor ) ;
-FUNCTION: CXSourceRange clang_getCursorExtent ( CXCursor ) ;
-
-ENUM: CXTypeKind
- { CXType_Invalid 0 }
- { CXType_Unexposed 1 }
- { CXType_Void 2 }
- { CXType_Bool 3 }
- { CXType_Char_U 4 }
- { CXType_UChar 5 }
- { CXType_Char16 6 }
- { CXType_Char32 7 }
- { CXType_UShort 8 }
- { CXType_UInt 9 }
- { CXType_ULong 10 }
- { CXType_ULongLong 11 }
- { CXType_UInt128 12 }
- { CXType_Char_S 13 }
- { CXType_SChar 14 }
- { CXType_WChar 15 }
- { CXType_Short 16 }
- { CXType_Int 17 }
- { CXType_Long 18 }
- { CXType_LongLong 19 }
- { CXType_Int128 20 }
- { CXType_Float 21 }
- { CXType_Double 22 }
- { CXType_LongDouble 23 }
- { CXType_NullPtr 24 }
- { CXType_Overload 25 }
- { CXType_Dependent 26 }
- { CXType_ObjCId 27 }
- { CXType_ObjCClass 28 }
- { CXType_ObjCSel 29 }
- { CXType_FirstBuiltin 2 }
- { CXType_LastBuiltin 29 }
- { CXType_Complex 100 }
- { CXType_Pointer 101 }
- { CXType_BlockPointer 102 }
- { CXType_LValueReference 103 }
- { CXType_RValueReference 104 }
- { CXType_Record 105 }
- { CXType_Enum 106 }
- { CXType_Typedef 107 }
- { CXType_ObjCInterface 108 }
- { CXType_ObjCObjectPointer 109 }
- { CXType_FunctionNoProto 110 }
- { CXType_FunctionProto 111 } ;
-
-STRUCT: CXType
- { kind CXTypeKind }
- { data void*[2] } ;
-
-FUNCTION: CXType clang_getCursorType ( CXCursor C ) ;
-FUNCTION: uint clang_equalTypes ( CXType A, CXType B ) ;
-FUNCTION: CXType clang_getCanonicalType ( CXType T ) ;
-FUNCTION: uint clang_isConstQualifiedType ( CXType T ) ;
-FUNCTION: uint clang_isVolatileQualifiedType ( CXType T ) ;
-FUNCTION: uint clang_isRestrictQualifiedType ( CXType T ) ;
-FUNCTION: CXType clang_getPointeeType ( CXType T ) ;
-FUNCTION: CXCursor clang_getTypeDeclaration ( CXType T ) ;
-FUNCTION: CXString clang_getDeclObjCTypeEncoding ( CXCursor C ) ;
-FUNCTION: CXString clang_getTypeKindSpelling ( CXTypeKind K ) ;
-FUNCTION: CXType clang_getResultType ( CXType T ) ;
-FUNCTION: CXType clang_getCursorResultType ( CXCursor C ) ;
-FUNCTION: uint clang_isPODType ( CXType T ) ;
-FUNCTION: uint clang_isVirtualBase ( CXCursor ) ;
-
-ENUM: CX_CXXAccessSpecifier
- CX_CXXInvalidAccessSpecifier
- CX_CXXPublic
- CX_CXXProtected
- CX_CXXPrivate ;
-
-FUNCTION: CX_CXXAccessSpecifier clang_getCXXAccessSpecifier ( CXCursor ) ;
-FUNCTION: uint clang_getNumOverloadedDecls ( CXCursor cursor ) ;
-FUNCTION: CXCursor clang_getOverloadedDecl ( CXCursor cursor, uint index ) ;
-FUNCTION: CXType clang_getIBOutletCollectionType ( CXCursor ) ;
-
-ENUM: CXChildVisitResult
- CXChildVisit_Break
- CXChildVisit_Continue
- CXChildVisit_Recurse ;
-
-CALLBACK: CXChildVisitResult CXCursorVisitor ( CXCursor cursor,
- CXCursor parent,
- CXClientData client_data ) ;
-
-FUNCTION: uint clang_visitChildren ( CXCursor parent,
- CXCursorVisitor visitor,
- CXClientData client_data ) ;
-FUNCTION: CXString clang_getCursorUSR ( CXCursor ) ;
-FUNCTION: CXString clang_constructUSR_ObjCClass ( c-string class_name ) ;
-FUNCTION: CXString clang_constructUSR_ObjCCategory ( c-string class_name,
- c-string category_name ) ;
-FUNCTION: CXString clang_constructUSR_ObjCProtocol ( c-string protocol_name ) ;
-FUNCTION: CXString clang_constructUSR_ObjCIvar ( c-string name,
- CXString classUSR ) ;
-FUNCTION: CXString clang_constructUSR_ObjCMethod ( c-string name,
- uint isInstanceMethod,
- CXString classUSR ) ;
-FUNCTION: CXString clang_constructUSR_ObjCProperty ( c-string property,
- CXString classUSR ) ;
-FUNCTION: CXString clang_getCursorSpelling ( CXCursor ) ;
-FUNCTION: CXString clang_getCursorDisplayName ( CXCursor ) ;
-FUNCTION: CXCursor clang_getCursorReferenced ( CXCursor ) ;
-FUNCTION: CXCursor clang_getCursorDefinition ( CXCursor ) ;
-FUNCTION: uint clang_isCursorDefinition ( CXCursor ) ;
-FUNCTION: CXCursor clang_getCanonicalCursor ( CXCursor ) ;
-FUNCTION: uint clang_CXXMethod_isStatic ( CXCursor C ) ;
-FUNCTION: uint clang_CXXMethod_isVirtual ( CXCursor C ) ;
-FUNCTION: CXCursorKind clang_getTemplateCursorKind ( CXCursor C ) ;
-FUNCTION: CXCursor clang_getSpecializedCursorTemplate ( CXCursor C ) ;
-
-ENUM: CXTokenKind
- CXToken_Punctuation
- CXToken_Keyword
- CXToken_Identifier
- CXToken_Literal
- CXToken_Comment ;
-
-STRUCT: CXToken
- { int_data uint[4] }
- { ptr_data void* } ;
-
-FUNCTION: CXTokenKind clang_getTokenKind ( CXToken ) ;
-FUNCTION: CXString clang_getTokenSpelling ( CXTranslationUnit TU,
- CXToken Token ) ;
-FUNCTION: CXSourceLocation clang_getTokenLocation ( CXTranslationUnit TU,
- CXToken Token ) ;
-FUNCTION: CXSourceRange clang_getTokenExtent ( CXTranslationUnit TU,
- CXToken Token ) ;
-FUNCTION: void clang_tokenize ( CXTranslationUnit TU,
- CXSourceRange Range,
- CXToken** Tokens,
- uint* NumTokens ) ;
-FUNCTION: void clang_annotateTokens ( CXTranslationUnit TU,
- CXToken* Tokens,
- uint NumTokens,
- CXCursor* Cursors ) ;
-FUNCTION: void clang_disposeTokens ( CXTranslationUnit TU,
- CXToken* Tokens,
- uint NumTokens ) ;
-
-FUNCTION: CXString clang_getCursorKindSpelling ( CXCursorKind Kind ) ;
-FUNCTION: void clang_getDefinitionSpellingAndExtent ( CXCursor cursor,
- char** startBuf,
- char** endBuf,
- uint* startLine,
- uint* startColumn,
- uint* endLine,
- uint* endColumn ) ;
-FUNCTION: void clang_enableStackTraces ( ) ;
-
-CALLBACK: void executeOnThreadCallback ( void* ) ;
-FUNCTION: void clang_executeOnThread ( executeOnThreadCallback* callback,
- void* user_data,
- uint stack_size ) ;
-
-TYPEDEF: void* CXCompletionString
-
-STRUCT: CXCompletionResult
- { CursorKind CXCursorKind }
- { CompletionString CXCompletionString } ;
-
-ENUM: CXCompletionChunkKind
- CXCompletionChunk_Optional
- CXCompletionChunk_TypedText
- CXCompletionChunk_Text
- CXCompletionChunk_Placeholder
- CXCompletionChunk_Informative
- CXCompletionChunk_CurrentParameter
- CXCompletionChunk_LeftParen
- CXCompletionChunk_RightParen
- CXCompletionChunk_LeftBracket
- CXCompletionChunk_RightBracket
- CXCompletionChunk_LeftBrace
- CXCompletionChunk_RightBrace
- CXCompletionChunk_LeftAngle
- CXCompletionChunk_RightAngle
- CXCompletionChunk_Comma
- CXCompletionChunk_ResultType
- CXCompletionChunk_Colon
- CXCompletionChunk_SemiColon
- CXCompletionChunk_Equal
- CXCompletionChunk_HorizontalSpace
- CXCompletionChunk_VerticalSpace ;
-
-FUNCTION: CXCompletionChunkKind clang_getCompletionChunkKind ( CXCompletionString completion_string,
- uint chunk_number ) ;
-FUNCTION: CXString clang_getCompletionChunkText ( CXCompletionString completion_string,
- uint chunk_number ) ;
-FUNCTION: CXCompletionString clang_getCompletionChunkCompletionString ( CXCompletionString completion_string,
- uint chunk_number ) ;
-FUNCTION: uint clang_getNumCompletionChunks ( CXCompletionString completion_string ) ;
-FUNCTION: uint clang_getCompletionPriority ( CXCompletionString completion_string ) ;
-FUNCTION: CXAvailabilityKind clang_getCompletionAvailability ( CXCompletionString completion_string ) ;
-
-STRUCT: CXCodeCompleteResults
- { Results CXCompletionResult* }
- { NumResults uint } ;
-
-ENUM: CXCodeComplete_Flags
- { CXCodeComplete_IncludeMacros 1 }
- { CXCodeComplete_IncludeCodePatterns 2 } ;
-
-FUNCTION: uint clang_defaultCodeCompleteOptions ( ) ;
-
-FUNCTION: CXCodeCompleteResults* clang_codeCompleteAt ( CXTranslationUnit TU,
- c-string complete_filename,
- uint complete_line,
- uint complete_column,
- CXUnsavedFile* unsaved_files,
- uint num_unsaved_files,
- uint options ) ;
-
-FUNCTION: void clang_sortCodeCompletionResults ( CXCompletionResult* Results, uint NumResults ) ;
-FUNCTION: void clang_disposeCodeCompleteResults ( CXCodeCompleteResults* Results ) ;
-FUNCTION: uint clang_codeCompleteGetNumDiagnostics ( CXCodeCompleteResults* Results ) ;
-
-FUNCTION: CXDiagnostic clang_codeCompleteGetDiagnostic ( CXCodeCompleteResults* Results,
- uint Index ) ;
-
-FUNCTION: CXString clang_getClangVersion ( ) ;
-FUNCTION: void clang_toggleCrashRecovery ( uint isEnabled ) ;
-
-CALLBACK: void CXInclusionVisitor ( CXFile included_file,
- CXSourceLocation* inclusion_stack,
- uint include_len,
- CXClientData client_data ) ;
-
-FUNCTION: void clang_getInclusions ( CXTranslationUnit tu,
- CXInclusionVisitor visitor,
- CXClientData client_data ) ;
+++ /dev/null
-unix
\ No newline at end of file
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-
-USING: alien alien.c-types alien.libraries alien.syntax
-combinators kernel sequences system ;
-
-IN: llvm.core
-
-<<
-: add-llvm-library ( name -- )
- dup {
- { [ os macosx? ] [ "lib" ".dylib" surround ] }
- { [ os unix? ] [ "lib" ".so" surround ] }
- { [ os windows? ] [ ".dll" append ] }
- } cond cdecl add-library ;
-
-{ "LLVMSystem" "LLVMSupport" "LLVMCore" "LLVMBitReader" }
-[ add-llvm-library ] each
->>
-
-! llvm-c/Core.h
-
-LIBRARY: LLVMCore
-
-TYPEDEF: uint unsigned
-TYPEDEF: unsigned enum
-
-ENUM: LLVMAttribute
- { LLVMZExtAttribute 0b1 }
- { LLVMSExtAttribute 0b10 }
- { LLVMNoReturnAttribute 0b100 }
- { LLVMInRegAttribute 0b1000 }
- { LLVMStructRetAttribute 0b10000 }
- { LLVMNoUnwindAttribute 0b100000 }
- { LLVMNoAliasAttribute 0b1000000 }
- { LLVMByValAttribute 0b10000000 }
- { LLVMNestAttribute 0b100000000 }
- { LLVMReadNoneAttribute 0b1000000000 }
- { LLVMReadOnlyAttribute 0b10000000000 } ;
-
-ENUM: LLVMTypeKind
- LLVMVoidTypeKind
- LLVMFloatTypeKind
- LLVMDoubleTypeKind
- LLVMX86_FP80TypeKind
- LLVMFP128TypeKind
- LLVMPPC_FP128TypeKind
- LLVMLabelTypeKind
- LLVMMetadataTypeKind
- LLVMIntegerTypeKind
- LLVMFunctionTypeKind
- LLVMStructTypeKind
- LLVMArrayTypeKind
- LLVMPointerTypeKind
- LLVMOpaqueTypeKind
- LLVMVectorTypeKind ;
-
-ENUM: LLVMLinkage
- LLVMExternalLinkage
- LLVMLinkOnceLinkage
- LLVMWeakLinkage
- LLVMAppendingLinkage
- LLVMInternalLinkage
- LLVMDLLImportLinkage
- LLVMDLLExportLinkage
- LLVMExternalWeakLinkage
- LLVMGhostLinkage ;
-
-ENUM: LLVMVisibility
- LLVMDefaultVisibility
- LLVMHiddenVisibility
- LLVMProtectedVisibility ;
-
-ENUM: LLVMCallConv
- { LLVMCCallConv 0 }
- { LLVMFastCallConv 8 }
- { LLVMColdCallConv 9 }
- { LLVMX86StdcallCallConv 64 }
- { LLVMX86FastcallCallConv 65 } ;
-
-ENUM: LLVMIntPredicate
- { LLVMIntEQ 32 }
- { LLVMIntNE 33 }
- { LLVMIntUGT 34 }
- { LLVMIntUGE 35 }
- { LLVMIntULT 36 }
- { LLVMIntULE 37 }
- { LLVMIntSGT 38 }
- { LLVMIntSGE 39 }
- { LLVMIntSLT 40 }
- { LLVMIntSLE 41 } ;
-
-ENUM: LLVMRealPredicate
- LLVMRealPredicateFalse
- LLVMRealOEQ
- LLVMRealOGT
- LLVMRealOGE
- LLVMRealOLT
- LLVMRealOLE
- LLVMRealONE
- LLVMRealORD
- LLVMRealUNO
- LLVMRealUEQ
- LLVMRealUGT
- LLVMRealUGE
- LLVMRealULT
- LLVMRealULE
- LLVMRealUNE
- LLVMRealPredicateTrue ;
-
-! Opaque Types
-
-TYPEDEF: void* LLVMModuleRef
-
-TYPEDEF: void* LLVMPassManagerRef
-
-TYPEDEF: void* LLVMModuleProviderRef
-
-TYPEDEF: void* LLVMTypeRef
-
-TYPEDEF: void* LLVMTypeHandleRef
-
-TYPEDEF: void* LLVMValueRef
-
-TYPEDEF: void* LLVMBasicBlockRef
-
-TYPEDEF: void* LLVMBuilderRef
-
-TYPEDEF: void* LLVMMemoryBufferRef
-
-! Functions
-
-FUNCTION: void LLVMDisposeMessage ( c-string Message ) ;
-
-FUNCTION: LLVMModuleRef LLVMModuleCreateWithName ( c-string ModuleID ) ;
-
-FUNCTION: int LLVMAddTypeName ( LLVMModuleRef M, c-string Name, LLVMTypeRef Ty ) ;
-
-FUNCTION: void LLVMDisposeModule ( LLVMModuleRef M ) ;
-
-FUNCTION: void LLVMDumpModule ( LLVMModuleRef M ) ;
-
-FUNCTION: LLVMModuleProviderRef
-LLVMCreateModuleProviderForExistingModule ( LLVMModuleRef M ) ;
-
-FUNCTION: void LLVMDisposeModuleProvider ( LLVMModuleProviderRef MP ) ;
-
-! Types
-
-! LLVM types conform to the following hierarchy:
-!
-! types:
-! integer type
-! real type
-! function type
-! sequence types:
-! array type
-! pointer type
-! vector type
-! void type
-! label type
-! opaque type
-
-! See llvm::LLVMTypeKind::getTypeID.
-FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty ) ;
-
-! Operations on integer types
-FUNCTION: LLVMTypeRef LLVMInt1Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMInt8Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMInt16Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMInt32Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMInt64Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMIntType ( unsigned NumBits ) ;
-FUNCTION: unsigned LLVMGetIntTypeWidth ( LLVMTypeRef IntegerTy ) ;
-
-! Operations on real types
-FUNCTION: LLVMTypeRef LLVMFloatType ( ) ;
-FUNCTION: LLVMTypeRef LLVMDoubleType ( ) ;
-FUNCTION: LLVMTypeRef LLVMX86FP80Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMFP128Type ( ) ;
-FUNCTION: LLVMTypeRef LLVMPPCFP128Type ( ) ;
-
-! Operations on function types
-FUNCTION: LLVMTypeRef
-LLVMFunctionType ( LLVMTypeRef ReturnType, LLVMTypeRef* ParamTypes, unsigned ParamCount, int IsVarArg ) ;
-FUNCTION: int LLVMIsFunctionVarArg ( LLVMTypeRef FunctionTy ) ;
-FUNCTION: LLVMTypeRef LLVMGetReturnType ( LLVMTypeRef FunctionTy ) ;
-FUNCTION: unsigned LLVMCountParamTypes ( LLVMTypeRef FunctionTy ) ;
-FUNCTION: void LLVMGetParamTypes ( LLVMTypeRef FunctionTy, LLVMTypeRef* Dest ) ;
-
-! Operations on struct types
-FUNCTION: LLVMTypeRef
-LLVMStructType ( LLVMTypeRef* ElementTypes, unsigned ElementCount, int Packed ) ;
-FUNCTION: unsigned LLVMCountStructElementTypes ( LLVMTypeRef StructTy ) ;
-FUNCTION: void LLVMGetStructElementTypes ( LLVMTypeRef StructTy, LLVMTypeRef* Dest ) ;
-FUNCTION: int LLVMIsPackedStruct ( LLVMTypeRef StructTy ) ;
-
-! Operations on array, pointer, and vector types (sequence types)
-FUNCTION: LLVMTypeRef LLVMArrayType ( LLVMTypeRef ElementType, unsigned ElementCount ) ;
-FUNCTION: LLVMTypeRef LLVMPointerType ( LLVMTypeRef ElementType, unsigned AddressSpace ) ;
-FUNCTION: LLVMTypeRef LLVMVectorType ( LLVMTypeRef ElementType, unsigned ElementCount ) ;
-
-FUNCTION: LLVMTypeRef LLVMGetElementType ( LLVMTypeRef Ty ) ;
-FUNCTION: unsigned LLVMGetArrayLength ( LLVMTypeRef ArrayTy ) ;
-FUNCTION: unsigned LLVMGetPointerAddressSpace ( LLVMTypeRef PointerTy ) ;
-FUNCTION: unsigned LLVMGetVectorSize ( LLVMTypeRef VectorTy ) ;
-
-! Operations on other types
-FUNCTION: LLVMTypeRef LLVMVoidType ( ) ;
-FUNCTION: LLVMTypeRef LLVMLabelType ( ) ;
-FUNCTION: LLVMTypeRef LLVMOpaqueType ( ) ;
-
-! Operations on type handles
-FUNCTION: LLVMTypeHandleRef LLVMCreateTypeHandle ( LLVMTypeRef PotentiallyAbstractTy ) ;
-FUNCTION: void LLVMRefineType ( LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy ) ;
-FUNCTION: LLVMTypeRef LLVMResolveTypeHandle ( LLVMTypeHandleRef TypeHandle ) ;
-FUNCTION: void LLVMDisposeTypeHandle ( LLVMTypeHandleRef TypeHandle ) ;
-
-! Types end
-
-FUNCTION: unsigned LLVMCountParams ( LLVMValueRef Fn ) ;
-
-FUNCTION: void LLVMGetParams ( LLVMValueRef Fn, LLVMValueRef* Params ) ;
-
-FUNCTION: LLVMValueRef
-LLVMAddFunction ( LLVMModuleRef M, c-string Name, LLVMTypeRef FunctionTy ) ;
-
-FUNCTION: LLVMValueRef LLVMGetFirstFunction ( LLVMModuleRef M ) ;
-
-FUNCTION: LLVMValueRef LLVMGetNextFunction ( LLVMValueRef Fn ) ;
-
-FUNCTION: unsigned LLVMGetFunctionCallConv ( LLVMValueRef Fn ) ;
-
-FUNCTION: void LLVMSetFunctionCallConv ( LLVMValueRef Fn, unsigned CC ) ;
-
-FUNCTION: LLVMBasicBlockRef
-LLVMAppendBasicBlock ( LLVMValueRef Fn, c-string Name ) ;
-
-FUNCTION: LLVMValueRef LLVMGetBasicBlockParent ( LLVMBasicBlockRef BB ) ;
-
-! Values
-
-FUNCTION: LLVMTypeRef LLVMTypeOf ( LLVMValueRef Val ) ;
-FUNCTION: c-string LLVMGetValueName ( LLVMValueRef Val ) ;
-FUNCTION: void LLVMSetValueName ( LLVMValueRef Val, c-string Name ) ;
-FUNCTION: void LLVMDumpValue ( LLVMValueRef Val ) ;
-
-! Instruction Builders
-
-FUNCTION: LLVMBuilderRef LLVMCreateBuilder ( ) ;
-FUNCTION: void LLVMPositionBuilder
-( LLVMBuilderRef Builder, LLVMBasicBlockRef Block, LLVMValueRef Instr ) ;
-FUNCTION: void LLVMPositionBuilderBefore
-( LLVMBuilderRef Builder, LLVMValueRef Instr ) ;
-FUNCTION: void LLVMPositionBuilderAtEnd
-( LLVMBuilderRef Builder, LLVMBasicBlockRef Block ) ;
-FUNCTION: LLVMBasicBlockRef LLVMGetInsertBlock
-( LLVMBuilderRef Builder ) ;
-FUNCTION: void LLVMClearInsertionPosition
-( LLVMBuilderRef Builder ) ;
-FUNCTION: void LLVMInsertIntoBuilder
-( LLVMBuilderRef Builder, LLVMValueRef Instr ) ;
-FUNCTION: void LLVMDisposeBuilder
-( LLVMBuilderRef Builder ) ;
-
-! IB Terminators
-
-FUNCTION: LLVMValueRef LLVMBuildRetVoid
-( LLVMBuilderRef Builder ) ;
-FUNCTION: LLVMValueRef LLVMBuildRet
-( LLVMBuilderRef Builder, LLVMValueRef V ) ;
-FUNCTION: LLVMValueRef LLVMBuildBr
-( LLVMBuilderRef Builder, LLVMBasicBlockRef Dest ) ;
-FUNCTION: LLVMValueRef LLVMBuildCondBr
-( LLVMBuilderRef Builder, LLVMValueRef If, LLVMBasicBlockRef Then, LLVMBasicBlockRef Else ) ;
-FUNCTION: LLVMValueRef LLVMBuildSwitch
-( LLVMBuilderRef Builder, LLVMValueRef V, LLVMBasicBlockRef Else, unsigned NumCases ) ;
-FUNCTION: LLVMValueRef LLVMBuildInvoke
-( LLVMBuilderRef Builder, LLVMValueRef Fn, LLVMValueRef* Args, unsigned NumArgs,
- LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildUnwind
-( LLVMBuilderRef Builder ) ;
-FUNCTION: LLVMValueRef LLVMBuildUnreachable
-( LLVMBuilderRef Builder ) ;
-
-! IB Add Case to Switch
-
-FUNCTION: void LLVMAddCase
-( LLVMValueRef Switch, LLVMValueRef OnVal, LLVMBasicBlockRef Dest ) ;
-
-! IB Arithmetic
-
-FUNCTION: LLVMValueRef LLVMBuildAdd
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSub
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildMul
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildUDiv
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSDiv
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFDiv
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildURem
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSRem
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFRem
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildShl
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildLShr
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildAShr
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildAnd
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildOr
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildXor
-( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildNeg
-( LLVMBuilderRef Builder, LLVMValueRef V, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildNot
-( LLVMBuilderRef Builder, LLVMValueRef V, c-string Name ) ;
-
-! IB Memory
-
-FUNCTION: LLVMValueRef LLVMBuildMalloc
-( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildArrayMalloc
-( LLVMBuilderRef Builder, LLVMTypeRef Ty, LLVMValueRef Val, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildAlloca
-( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildArrayAlloca
-( LLVMBuilderRef Builder, LLVMTypeRef Ty, LLVMValueRef Val, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFree
-( LLVMBuilderRef Builder, LLVMValueRef PointerVal ) ;
-FUNCTION: LLVMValueRef LLVMBuildLoad
-( LLVMBuilderRef Builder, LLVMValueRef PointerVal, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildStore
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMValueRef Ptr ) ;
-FUNCTION: LLVMValueRef LLVMBuildGEP
-( LLVMBuilderRef B, LLVMValueRef Pointer, LLVMValueRef* Indices,
- unsigned NumIndices, c-string Name ) ;
-
-! IB Casts
-
-FUNCTION: LLVMValueRef LLVMBuildTrunc
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildZExt
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSExt
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFPToUI
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFPToSI
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildUIToFP
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSIToFP
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFPTrunc
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFPExt
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildPtrToInt
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildIntToPtr
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildBitCast
-( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
-
-! IB Comparisons
-
-FUNCTION: LLVMValueRef LLVMBuildICmp
-( LLVMBuilderRef Builder, LLVMIntPredicate Op, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildFCmp
-( LLVMBuilderRef Builder, LLVMRealPredicate Op, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
-
-! IB Misc Instructions
-
-FUNCTION: LLVMValueRef LLVMBuildPhi
-( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildCall
-( LLVMBuilderRef Builder, LLVMValueRef Fn, LLVMValueRef* Args, unsigned NumArgs, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildSelect
-( LLVMBuilderRef Builder, LLVMValueRef If, LLVMValueRef Then, LLVMValueRef Else, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildVAArg
-( LLVMBuilderRef Builder, LLVMValueRef List, LLVMTypeRef Ty, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildExtractElement
-( LLVMBuilderRef Builder, LLVMValueRef VecVal, LLVMValueRef Index, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildInsertElement
-( LLVMBuilderRef Builder, LLVMValueRef VecVal, LLVMValueRef EltVal, LLVMValueRef Index, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildShuffleVector
-( LLVMBuilderRef Builder, LLVMValueRef V1, LLVMValueRef V2, LLVMValueRef Mask, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildExtractValue
-( LLVMBuilderRef Builder, LLVMValueRef AggVal, unsigned Index, c-string Name ) ;
-FUNCTION: LLVMValueRef LLVMBuildInsertValue
-( LLVMBuilderRef Builder, LLVMValueRef AggVal, LLVMValueRef EltVal, unsigned Index, c-string Name ) ;
-
-! Memory Buffers/Bit Reader
-
-FUNCTION: int LLVMCreateMemoryBufferWithContentsOfFile
-( c-string Path, LLVMMemoryBufferRef* OutMemBuf, c-string* OutMessage ) ;
-
-FUNCTION: void LLVMDisposeMemoryBuffer ( LLVMMemoryBufferRef MemBuf ) ;
-
-LIBRARY: LLVMBitReader
-
-FUNCTION: int LLVMParseBitcode
-( LLVMMemoryBufferRef MemBuf, LLVMModuleRef* OutModule, c-string* OutMessage ) ;
-
-FUNCTION: int LLVMGetBitcodeModuleProvider
-( LLVMMemoryBufferRef MemBuf, LLVMModuleProviderRef* OutMP, c-string* OutMessage ) ;
+++ /dev/null
-not tested
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.c-types alien.libraries alien.syntax kernel
-llvm.core sequences ;
-IN: llvm.engine
-
-<<
-{
- "LLVMExecutionEngine" "LLVMTarget" "LLVMAnalysis" "LLVMipa"
- "LLVMTransformUtils" "LLVMScalarOpts" "LLVMCodeGen"
- "LLVMAsmPrinter" "LLVMSelectionDAG" "LLVMX86CodeGen"
- "LLVMJIT" "LLVMInterpreter"
-} [ add-llvm-library ] each
->>
-
-! llvm-c/ExecutionEngine.h
-
-LIBRARY: LLVMExecutionEngine
-
-TYPEDEF: void* LLVMGenericValueRef
-TYPEDEF: void* LLVMExecutionEngineRef
-
-FUNCTION: LLVMGenericValueRef LLVMCreateGenericValueOfInt
-( LLVMTypeRef Ty, ulonglong N, int IsSigned ) ;
-
-FUNCTION: ulonglong LLVMGenericValueToInt
-( LLVMGenericValueRef GenVal, int IsSigned ) ;
-
-FUNCTION: int LLVMCreateExecutionEngine
-( LLVMExecutionEngineRef *OutEE, LLVMModuleProviderRef MP, c-string* OutError ) ;
-
-FUNCTION: int LLVMCreateJITCompiler
-( LLVMExecutionEngineRef* OutJIT, LLVMModuleProviderRef MP, unsigned OptLevel, c-string* OutError ) ;
-
-FUNCTION: void LLVMDisposeExecutionEngine ( LLVMExecutionEngineRef EE ) ;
-
-FUNCTION: void LLVMFreeMachineCodeForFunction ( LLVMExecutionEngineRef EE, LLVMValueRef F ) ;
-
-FUNCTION: void LLVMAddModuleProvider ( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP ) ;
-
-FUNCTION: int LLVMRemoveModuleProvider
-( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP, LLVMModuleRef* OutMod, c-string* OutError ) ;
-
-FUNCTION: int LLVMFindFunction
-( LLVMExecutionEngineRef EE, c-string Name, LLVMValueRef* OutFn ) ;
-
-FUNCTION: void* LLVMGetPointerToGlobal ( LLVMExecutionEngineRef EE, LLVMValueRef Global ) ;
-
-FUNCTION: LLVMGenericValueRef LLVMRunFunction
-( LLVMExecutionEngineRef EE, LLVMValueRef F, unsigned NumArgs, LLVMGenericValueRef* Args ) ;
+++ /dev/null
-not tested
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: alien.llvm io.pathnames llvm.invoker llvm.reader tools.test ;
-
-{ 3 } [
- << "resource:extra/llvm/reader/add.bc" install-bc >> 1 2 add
-] unit-test
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien alien.data arrays assocs compiler.units
-effects io.backend io.pathnames kernel llvm.core llvm.jit
-llvm.reader llvm.types make namespaces sequences
-specialized-arrays vocabs words ;
-QUALIFIED-WITH: alien.c-types c
-SPECIALIZED-ARRAY: c:void*
-IN: llvm.invoker
-
-! get function name, ret type, param types and names
-
-! load module
-! iterate through functions in a module
-
-TUPLE: function name alien return params ;
-
-: params ( llvm-function -- param-list )
- dup LLVMCountParams c:void* <c-array>
- [ LLVMGetParams ] keep >array
- [ [ LLVMGetValueName ] [ LLVMTypeOf tref> ] bi 2array ] map ;
-
-: <function> ( LLVMValueRef -- function )
- function new
- over LLVMGetValueName >>name
- over LLVMTypeOf tref> type>> return>> >>return
- swap params >>params ;
-
-: (functions) ( llvm-function -- )
- [ dup , LLVMGetNextFunction (functions) ] when* ;
-
-: functions ( llvm-module -- functions )
- LLVMGetFirstFunction [ (functions) ] { } make [ <function> ] map ;
-
-: function-effect ( function -- effect )
- [ params>> keys ] [ return>> void? 0 1 ? ] bi <effect> ;
-
-: install-function ( function -- )
- dup name>> "alien.llvm" create-vocab drop
- "alien.llvm" create-word swap
- [
- dup name>> function-pointer ,
- dup return>> c:lookup-c-type ,
- dup params>> [ second c:lookup-c-type ] map ,
- cdecl , \ alien-indirect ,
- ] [ ] make swap function-effect [ define-declared ] with-compilation-unit ;
-
-: install-module ( name -- )
- current-jit mps>> at [
- module>> functions [ install-function ] each
- ] [ "no such module" throw ] if* ;
-
-: install-bc ( path -- )
- [ normalize-path ] [ file-name ] bi
- [ load-into-jit ] keep install-module ;
-
-<< "alien.llvm" create-vocab drop >>
+++ /dev/null
-not tested
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: destructors llvm.jit llvm.wrappers tools.test ;
-
-{ } [ "test" <module> "test" add-module "test" remove-module ] unit-test
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data alien.syntax assocs
-destructors kernel llvm.core llvm.engine llvm.wrappers
-namespaces ;
-
-IN: llvm.jit
-
-TUPLE: jit ee mps ;
-
-: empty-engine ( -- engine )
- "initial-module" <module> <provider> <engine> ;
-
-: <jit> ( -- jit )
- jit new empty-engine >>ee H{ } clone >>mps ;
-
-: current-jit ( -- jit )
- \ current-jit global [ drop <jit> ] cache ;
-
-: (remove-functions) ( function -- )
- current-jit ee>> value>> over LLVMFreeMachineCodeForFunction
- LLVMGetNextFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
-
-: remove-functions ( module -- )
- ! free machine code for each function in module
- LLVMGetFirstFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
-
-: remove-provider ( provider -- )
- current-jit ee>> value>> swap value>> f void* <ref> f void* <ref>
- [ LLVMRemoveModuleProvider drop ] 2keep void* deref [ llvm-throw ] when*
- void* deref module new swap >>value
- [ value>> remove-functions ] with-disposal ;
-
-: remove-module ( name -- )
- dup current-jit mps>> at [
- remove-provider
- current-jit mps>> delete-at
- ] [ drop ] if* ;
-
-: add-module ( module name -- )
- [ <provider> ] dip [ remove-module ] keep
- current-jit ee>> value>> pick
- [ [ value>> LLVMAddModuleProvider ] [ t >>disposed drop ] bi ] with-disposal
- current-jit mps>> set-at ;
-
-: function-pointer ( name -- alien )
- current-jit ee>> value>> dup
- rot f void* <ref> [ LLVMFindFunction drop ] keep
- void* deref LLVMGetPointerToGlobal ;
+++ /dev/null
-not tested
+++ /dev/null
-define i32 @add(i32 %x, i32 %y) {
-entry:
- %sum = add i32 %x, %y
- ret i32 %sum
-}
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data alien.syntax
-destructors kernel llvm.core llvm.engine llvm.jit llvm.wrappers
-;
-
-IN: llvm.reader
-
-: buffer>module ( buffer -- module )
- [
- value>> f void* <ref> f void* <ref>
- [ LLVMParseBitcode drop ] 2keep
- void* deref [ llvm-throw ] when* void* deref
- module new swap >>value
- ] with-disposal ;
-
-: load-module ( path -- module )
- <buffer> buffer>module ;
-
-: load-into-jit ( path name -- )
- [ load-module ] dip add-module ;
+++ /dev/null
-not tested
+++ /dev/null
-bindings
-not tested
+++ /dev/null
-not tested
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel llvm.types sequences tools.test ;
-
-{ T{ integer f 32 } } [ " i32 " parse-type ] unit-test
-{ float } [ " float " parse-type ] unit-test
-{ T{ pointer f f x86_fp80 } } [ " x86_fp80 * " parse-type ] unit-test
-{ T{ vector f f 4 T{ integer f 32 } } } [ " < 4 x i32 > " parse-type ] unit-test
-{ T{ struct f f { float double } f } } [ TYPE: { float , double } ; ] unit-test
-{ T{ array f f 0 float } } [ TYPE: [ 0 x float ] ; ] unit-test
-
-{ label void metadata }
-[ [ " label " " void " " metadata " ] [ parse-type ] each ] unit-test
-
-{ T{ function f f float { float float } t } }
-[ TYPE: float ( float , float , ... ) ; ] unit-test
-
-{ T{ struct f f { float TYPE: i32 (i32)* ; } t } }
-[ TYPE: < { float, i32 (i32)* } > ; ] unit-test
-
-{ t } [ TYPE: i32 ; TYPE: i32 ; [ >tref ] same? ] unit-test
-{ t } [ TYPE: i32 * ; TYPE: i32 * ; [ >tref ] same? ] unit-test
-
-{ TYPE: i32 ; } [ TYPE: i32 ; >tref tref> ] unit-test
-{ TYPE: float ; } [ TYPE: float ; >tref tref> ] unit-test
-{ TYPE: double ; } [ TYPE: double ; >tref tref> ] unit-test
-{ TYPE: x86_fp80 ; } [ TYPE: x86_fp80 ; >tref tref> ] unit-test
-{ TYPE: fp128 ; } [ TYPE: fp128 ; >tref tref> ] unit-test
-{ TYPE: ppc_fp128 ; } [ TYPE: ppc_fp128 ; >tref tref> ] unit-test
-{ TYPE: opaque ; } [ TYPE: opaque ; >tref tref> ] unit-test
-{ TYPE: label ; } [ TYPE: label ; >tref tref> ] unit-test
-{ TYPE: void ; } [ TYPE: void ; >tref tref> ] unit-test
-{ TYPE: i32* ; } [ TYPE: i32* ; >tref tref> ] unit-test
-{ TYPE: < 2 x i32 > ; } [ TYPE: < 2 x i32 > ; >tref tref> ] unit-test
-{ TYPE: [ 0 x i32 ] ; } [ TYPE: [ 0 x i32 ] ; >tref tref> ] unit-test
-{ TYPE: { i32, i32 } ; } [ TYPE: { i32, i32 } ; >tref tref> ] unit-test
-{ TYPE: < { i32, i32 } > ; } [ TYPE: < { i32, i32 } > ; >tref tref> ] unit-test
-{ TYPE: i32 ( i32 ) ; } [ TYPE: i32 ( i32 ) ; >tref tref> ] unit-test
-{ TYPE: \1* ; } [ TYPE: \1* ; >tref tref> ] unit-test
-{ TYPE: { i32, \2* } ; } [ TYPE: { i32, \2* } ; >tref tref> ] unit-test
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data arrays combinators
-kernel llvm.core locals math.parser math multiline namespaces
-parser peg.ebnf sequences sequences.deep specialized-arrays
-strings vocabs words ;
-SPECIALIZED-ARRAY: void*
-IN: llvm.types
-
-! Type resolution strategy:
-! pass 1:
-! create the type with uprefs mapped to opaque types
-! cache typerefs in enclosing types for pass 2
-! if our type is concrete, then we are done
-!
-! pass 2:
-! wrap our abstract type in a type handle
-! create a second type, using the cached enclosing type info
-! resolve the first type to the second
-!
-GENERIC: (>tref) ( type -- LLVMTypeRef )
-GENERIC: ((tref>)) ( LLVMTypeRef type -- type )
-GENERIC: c-type ( type -- str )
-
-! default implementation for simple types
-M: object ((tref>)) nip ;
-: unsupported-type ( -- )
- "cannot generate c-type: unsupported llvm type" throw ;
-M: object c-type unsupported-type ;
-
-TUPLE: integer size ;
-C: <integer> integer
-
-M: integer (>tref) size>> LLVMIntType ;
-M: integer ((tref>)) swap LLVMGetIntTypeWidth >>size ;
-M: integer c-type size>> {
- { 64 [ "longlong" ] }
- { 32 [ "int" ] }
- { 16 [ "short" ] }
- { 8 [ "char" ] }
- [ unsupported-type ]
-} case ;
-
-SINGLETONS: float double x86_fp80 fp128 ppc_fp128 ;
-
-M: float (>tref) drop LLVMFloatType ;
-M: double (>tref) drop LLVMDoubleType ;
-M: double c-type drop "double" ;
-M: x86_fp80 (>tref) drop LLVMX86FP80Type ;
-M: fp128 (>tref) drop LLVMFP128Type ;
-M: ppc_fp128 (>tref) drop LLVMPPCFP128Type ;
-
-SINGLETONS: opaque label void metadata ;
-
-M: opaque (>tref) drop LLVMOpaqueType ;
-M: label (>tref) drop LLVMLabelType ;
-M: void (>tref) drop LLVMVoidType ;
-M: void c-type drop "void" ;
-M: metadata (>tref) drop
- "metadata types unsupported by llvm c bindings" throw ;
-
-! enclosing types cache their llvm refs during
-! the first pass, used in the second pass to
-! resolve uprefs
-TUPLE: enclosing cached ;
-
-GENERIC: clean ( type -- )
-GENERIC: clean* ( type -- )
-M: object clean drop ;
-M: enclosing clean f >>cached clean* ;
-
-! builds the stack of types that uprefs need to refer to
-SYMBOL: types
-:: push-type ( type quot: ( type -- LLVMTypeRef ) -- LLVMTypeRef )
- type types get push
- type quot call( type -- LLVMTypeRef )
- types get pop over >>cached drop ;
-
-DEFER: <up-ref>
-:: push-ref ( ref quot: ( LLVMTypeRef -- type ) -- type )
- ref types get index
- [ types get length swap - <up-ref> ] [
- ref types get push
- ref quot call( LLVMTypeRef -- type )
- types get pop drop
- ] if* ;
-
-GENERIC: (>tref)* ( type -- LLVMTypeRef )
-M: enclosing (>tref) [ (>tref)* ] push-type ;
-
-DEFER: type-kind
-GENERIC: (tref>)* ( LLVMTypeRef type -- type )
-M: enclosing ((tref>)) [ (tref>)* ] curry push-ref ;
-
-: (tref>) ( LLVMTypeRef -- type ) dup type-kind ((tref>)) ;
-
-TUPLE: pointer < enclosing type ;
-: <pointer> ( t -- o ) pointer new swap >>type ;
-
-M: pointer (>tref)* type>> (>tref) 0 LLVMPointerType ;
-M: pointer clean* type>> clean ;
-M: pointer (tref>)* swap LLVMGetElementType (tref>) >>type ;
-M: pointer c-type type>> 8 <integer> = "c-string" "void*" ? ;
-
-TUPLE: vector < enclosing size type ;
-: <vector> ( s t -- o )
- vector new
- swap >>type swap >>size ;
-
-M: vector (>tref)* [ type>> (>tref) ] [ size>> ] bi LLVMVectorType ;
-M: vector clean* type>> clean ;
-M: vector (tref>)*
- over LLVMGetElementType (tref>) >>type
- swap LLVMGetVectorSize >>size ;
-
-TUPLE: struct < enclosing types packed? ;
-: <struct> ( ts p? -- o )
- struct new
- swap >>packed? swap >>types ;
-
-M: struct (>tref)*
- [ types>> [ (>tref) ] map void* >c-array ]
- [ types>> length ]
- [ packed?>> 1 0 ? ] tri LLVMStructType ;
-M: struct clean* types>> [ clean ] each ;
-M: struct (tref>)*
- over LLVMIsPackedStruct 0 = not >>packed?
- swap dup LLVMCountStructElementTypes void* <c-array>
- [ LLVMGetStructElementTypes ] keep >array
- [ (tref>) ] map >>types ;
-
-TUPLE: array < enclosing size type ;
-: <array> ( s t -- o )
- array new
- swap >>type swap >>size ;
-
-M: array (>tref)* [ type>> (>tref) ] [ size>> ] bi LLVMArrayType ;
-M: array clean* type>> clean ;
-M: array (tref>)*
- over LLVMGetElementType (tref>) >>type
- swap LLVMGetArrayLength >>size ;
-
-SYMBOL: ...
-TUPLE: function < enclosing return params vararg? ;
-: <function> ( ret params var? -- o )
- function new
- swap >>vararg? swap >>params swap >>return ;
-
-M: function (>tref)* {
- [ return>> (>tref) ]
- [ params>> [ (>tref) ] map void* >c-array ]
- [ params>> length ]
- [ vararg?>> 1 0 ? ]
-} cleave LLVMFunctionType ;
-M: function clean* [ return>> clean ] [ params>> [ clean ] each ] bi ;
-M: function (tref>)*
- over LLVMIsFunctionVarArg 0 = not >>vararg?
- over LLVMGetReturnType (tref>) >>return
- swap dup LLVMCountParamTypes void* <c-array>
- [ LLVMGetParamTypes ] keep >array
- [ (tref>) ] map >>params ;
-
-: type-kind ( LLVMTypeRef -- class )
- LLVMGetTypeKind {
- { LLVMVoidTypeKind [ void ] }
- { LLVMFloatTypeKind [ float ] }
- { LLVMDoubleTypeKind [ double ] }
- { LLVMX86_FP80TypeKind [ x86_fp80 ] }
- { LLVMFP128TypeKind [ fp128 ] }
- { LLVMPPC_FP128TypeKind [ ppc_fp128 ] }
- { LLVMLabelTypeKind [ label ] }
- { LLVMIntegerTypeKind [ integer new ] }
- { LLVMFunctionTypeKind [ function new ] }
- { LLVMStructTypeKind [ struct new ] }
- { LLVMArrayTypeKind [ array new ] }
- { LLVMPointerTypeKind [ pointer new ] }
- { LLVMOpaqueTypeKind [ opaque ] }
- { LLVMVectorTypeKind [ vector new ] }
- } case ;
-
-TUPLE: up-ref height ;
-C: <up-ref> up-ref
-
-M: up-ref (>tref)
- types get length swap height>> - types get nth
- cached>> [ LLVMOpaqueType ] unless* ;
-
-: resolve-types ( typeref typeref -- typeref )
- over LLVMCreateTypeHandle [ LLVMRefineType ] dip
- [ LLVMResolveTypeHandle ] keep LLVMDisposeTypeHandle ;
-
-: >tref-caching ( type -- LLVMTypeRef )
- V{ } clone types [ (>tref) ] with-variable ;
-
-: >tref ( type -- LLVMTypeRef )
- [ >tref-caching ] [ >tref-caching ] [ clean ] tri
- 2dup = [ drop ] [ resolve-types ] if ;
-
-: tref> ( LLVMTypeRef -- type )
- V{ } clone types [ (tref>) ] with-variable ;
-
-: t. ( type -- )
- >tref
- "type-info" LLVMModuleCreateWithName
- [ "t" rot LLVMAddTypeName drop ]
- [ LLVMDumpModule ]
- [ LLVMDisposeModule ] tri ;
-
-EBNF: parse-type
-
-WhiteSpace = " "*
-
-Zero = "0" => [[ drop 0 ]]
-LeadingDigit = [1-9]
-DecimalDigit = [0-9]
-Number = LeadingDigit:d (DecimalDigit)*:ds => [[ ds d prefix string>number ]]
-WhiteNumberSpace = WhiteSpace Number:n WhiteSpace => [[ n ]]
-WhiteZeroSpace = WhiteSpace (Zero | Number):n WhiteSpace => [[ n ]]
-
-Integer = "i" Number:n => [[ n <integer> ]]
-FloatingPoint = ( "float" | "double" | "x86_fp80" | "fp128" | "ppc_fp128" ) => [[ "llvm.types" vocab lookup-word ]]
-LabelVoidMetadata = ( "label" | "void" | "metadata" | "opaque" ) => [[ "llvm.types" vocab lookup-word ]]
-Primitive = LabelVoidMetadata | FloatingPoint
-Pointer = T:t WhiteSpace "*" => [[ t <pointer> ]]
-Vector = "<" WhiteNumberSpace:n "x" Type:t ">" => [[ n t <vector> ]]
-StructureTypesList = "," Type:t => [[ t ]]
-Structure = "{" Type:t (StructureTypesList)*:ts "}" => [[ ts t prefix >array f <struct> ]]
-Array = "[" WhiteZeroSpace:n "x" Type:t "]" => [[ n t <array> ]]
-NoFunctionParams = "(" WhiteSpace ")" => [[ drop { } ]]
-VarArgs = WhiteSpace "..." WhiteSpace => [[ drop ... ]]
-ParamListContinued = "," (Type | VarArgs):t => [[ t ]]
-ParamList = "(" Type:t (ParamListContinued*):ts ")" => [[ ts t prefix ]]
-Function = T:t WhiteSpace ( ParamList | NoFunctionParams ):ts => [[ ... ts member? dup [ ... ts remove! drop ] when t ts >array rot <function> ]]
-PackedStructure = "<" WhiteSpace "{" Type:ty (StructureTypesList)*:ts "}" WhiteSpace ">" => [[ ts ty prefix >array t <struct> ]]
-UpReference = "\\" Number:n => [[ n <up-ref> ]]
-Name = '%' ([a-zA-Z][a-zA-Z0-9]*):id => [[ id flatten >string ]]
-
-T = Pointer | Function | Primitive | Integer | Vector | Structure | PackedStructure | Array | UpReference | Name
-
-Type = WhiteSpace T:t WhiteSpace => [[ t ]]
-
-Program = Type
-
-;EBNF
-
-SYNTAX: TYPE: ";" parse-multiline-string parse-type suffix! ;
+++ /dev/null
-not tested
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: destructors kernel llvm.wrappers sequences tools.test vocabs ;
-
-{ } [ "test" <module> dispose ] unit-test
-{ } [ "test" <module> <provider> dispose ] unit-test
-{ } [ "llvm.jit" vocabs member? [ "test" <module> <provider> <engine> dispose ] unless ] unit-test
+++ /dev/null
-! Copyright (C) 2009 Matthew Willis.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data alien.strings
-io.encodings.utf8 destructors kernel
-llvm.core llvm.engine ;
-
-IN: llvm.wrappers
-
-: llvm-throw ( c-string -- )
- [ utf8 alien>string ] [ LLVMDisposeMessage ] bi throw ;
-
-: <dispose> ( alien class -- disposable ) new swap >>value ;
-
-TUPLE: module value disposed ;
-M: module dispose* value>> LLVMDisposeModule ;
-
-: <module> ( name -- module )
- LLVMModuleCreateWithName module <dispose> ;
-
-TUPLE: provider value module disposed ;
-M: provider dispose* value>> LLVMDisposeModuleProvider ;
-
-: (provider) ( module -- provider )
- [ value>> LLVMCreateModuleProviderForExistingModule provider <dispose> ]
- [ t >>disposed value>> ] bi
- >>module ;
-
-: <provider> ( module -- provider )
- [ (provider) ] with-disposal ;
-
-TUPLE: engine value disposed ;
-M: engine dispose* value>> LLVMDisposeExecutionEngine ;
-
-: (engine) ( provider -- engine )
- [
- value>> f void* <ref> f void* <ref>
- [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep
- void* deref [ llvm-throw ] when* void* deref
- ]
- [ t >>disposed drop ] bi
- engine <dispose> ;
-
-: <engine> ( provider -- engine )
- [ (engine) ] with-disposal ;
-
-: (add-block) ( name -- basic-block )
- "function" swap LLVMAppendBasicBlock ;
-
-TUPLE: builder value disposed ;
-M: builder dispose* value>> LLVMDisposeBuilder ;
-
-: <builder> ( name -- builder )
- (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
- builder <dispose> ;
-
-TUPLE: buffer value disposed ;
-M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
-
-: <buffer> ( path -- module )
- f void* <ref> f void* <ref>
- [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
- void* deref [ llvm-throw ] when* void* deref buffer <dispose> ;
--- /dev/null
+Matthew Willis
--- /dev/null
+USING: alien alien.c-types alien.libraries alien.syntax
+classes.struct combinators system unix.types ;
+IN: llvm.clang.ffi
+
+<<
+"libclang" {
+ { [ os macosx? ] [ "libclang.dylib" ] }
+ { [ os windows? ] [ "clang.dll" ] }
+ { [ os unix? ] [ "/usrlibclang.so" ] }
+} cond cdecl add-library
+>>
+LIBRARY: libclang
+
+C-TYPE: CXTranslationUnitImpl
+
+TYPEDEF: void* CXIndex
+TYPEDEF: CXTranslationUnitImpl* CXTranslationUnit
+TYPEDEF: void* CXClientData
+
+STRUCT: CXUnsavedFile
+ { Filename c-string }
+ { Contents c-string }
+ { Length ulong } ;
+
+ENUM: CXAvailabilityKind
+ CXAvailability_Available
+ CXAvailability_Deprecated
+ CXAvailability_NotAvailable ;
+
+STRUCT: CXString
+ { data void* }
+ { private_flags uint } ;
+
+FUNCTION: c-string clang_getCString ( CXString string ) ;
+FUNCTION: void clang_disposeString ( CXString string ) ;
+
+FUNCTION: CXIndex clang_createIndex ( int excludeDeclarationsFromPCH,
+ int displayDiagnostics ) ;
+FUNCTION: void clang_disposeIndex ( CXIndex index ) ;
+
+TYPEDEF: void* CXFile
+
+FUNCTION: CXString clang_getFileName ( CXFile SFile ) ;
+FUNCTION: time_t clang_getFileTime ( CXFile SFile ) ;
+FUNCTION: uint clang_isFileMultipleIncludeGuarded ( CXTranslationUnit tu, CXFile file ) ;
+FUNCTION: CXFile clang_getFile ( CXTranslationUnit tu, c-string file_name ) ;
+
+STRUCT: CXSourceLocation
+ { ptr_data void*[2] }
+ { int_data uint } ;
+
+STRUCT: CXSourceRange
+ { ptr_data void*[2] }
+ { begin_int_data uint }
+ { end_int_data uint } ;
+
+FUNCTION: CXSourceLocation clang_getNullLocation ( ) ;
+FUNCTION: uint clang_equalLocations ( CXSourceLocation loc1, CXSourceLocation loc2 ) ;
+
+FUNCTION: CXSourceLocation clang_getLocation ( CXTranslationUnit tu, CXFile file, uint line, uint column ) ;
+FUNCTION: CXSourceLocation clang_getLocationForOffset ( CXTranslationUnit tu,
+ CXFile file,
+ uint offset ) ;
+
+FUNCTION: CXSourceRange clang_getNullRange ( ) ;
+
+FUNCTION: CXSourceRange clang_getRange ( CXSourceLocation begin,
+ CXSourceLocation end ) ;
+
+FUNCTION: void clang_getInstantiationLocation ( CXSourceLocation location,
+ CXFile* file,
+ uint* line,
+ uint* column,
+ uint* offset ) ;
+
+FUNCTION: void clang_getSpellingLocation ( CXSourceLocation location,
+ CXFile* file,
+ uint* line,
+ uint* column,
+ uint* offset ) ;
+
+FUNCTION: CXSourceLocation clang_getRangeStart ( CXSourceRange range ) ;
+FUNCTION: CXSourceLocation clang_getRangeEnd ( CXSourceRange range ) ;
+
+ENUM: CXDiagnosticSeverity
+ CXDiagnostic_Ignored
+ CXDiagnostic_Note
+ CXDiagnostic_Warning
+ CXDiagnostic_Error
+ CXDiagnostic_Fatal ;
+
+TYPEDEF: void* CXDiagnostic
+
+FUNCTION: uint clang_getNumDiagnostics ( CXTranslationUnit Unit ) ;
+FUNCTION: CXDiagnostic clang_getDiagnostic ( CXTranslationUnit Unit,
+ uint Index ) ;
+FUNCTION: void clang_disposeDiagnostic ( CXDiagnostic Diagnostic ) ;
+
+ENUM: CXDiagnosticDisplayOptions
+ { CXDiagnostic_DisplaySourceLocation 0x01 }
+ { CXDiagnostic_DisplayColumn 0x02 }
+ { CXDiagnostic_DisplaySourceRanges 0x04 }
+ { CXDiagnostic_DisplayOption 0x08 }
+ { CXDiagnostic_DisplayCategoryId 0x10 }
+ { CXDiagnostic_DisplayCategoryName 0x20 } ;
+
+FUNCTION: CXString clang_formatDiagnostic ( CXDiagnostic Diagnostic,
+ uint Options ) ;
+FUNCTION: uint clang_defaultDiagnosticDisplayOptions ( ) ;
+
+FUNCTION: CXDiagnosticSeverity clang_getDiagnosticSeverity ( CXDiagnostic ) ;
+FUNCTION: CXSourceLocation clang_getDiagnosticLocation ( CXDiagnostic ) ;
+FUNCTION: CXString clang_getDiagnosticSpelling ( CXDiagnostic ) ;
+FUNCTION: CXString clang_getDiagnosticOption ( CXDiagnostic Diag, CXString* Disable ) ;
+FUNCTION: uint clang_getDiagnosticCategory ( CXDiagnostic ) ;
+FUNCTION: CXString clang_getDiagnosticCategoryName ( uint Category ) ;
+FUNCTION: uint clang_getDiagnosticNumRanges ( CXDiagnostic ) ;
+FUNCTION: CXSourceRange clang_getDiagnosticRange ( CXDiagnostic Diagnostic, uint Range ) ;
+FUNCTION: uint clang_getDiagnosticNumFixIts ( CXDiagnostic Diagnostic ) ;
+FUNCTION: CXString clang_getDiagnosticFixIt ( CXDiagnostic Diagnostic,
+ uint FixIt,
+ CXSourceRange* ReplacementRange ) ;
+FUNCTION: CXString clang_getTranslationUnitSpelling ( CXTranslationUnit CTUnit ) ;
+FUNCTION: CXTranslationUnit clang_createTranslationUnitFromSourceFile ( CXIndex CIdx,
+ c-string source_filename,
+ int num_clang_command_line_args,
+ char** clang_command_line_args,
+ uint num_unsaved_files,
+ CXUnsavedFile* unsaved_files ) ;
+FUNCTION: CXTranslationUnit clang_createTranslationUnit ( CXIndex CIdx, c-string ast_filename ) ;
+
+ENUM: CXTranslationUnit_Flags
+ { CXTranslationUnit_None 0x00 }
+ { CXTranslationUnit_DetailedPreprocessingRecord 0x01 }
+ { CXTranslationUnit_Incomplete 0x02 }
+ { CXTranslationUnit_PrecompiledPreamble 0x04 }
+ { CXTranslationUnit_CacheCompletionResults 0x08 }
+ { CXTranslationUnit_CXXPrecompiledPreamble 0x10 }
+ { CXTranslationUnit_CXXChainedPCH 0x20 }
+ { CXTranslationUnit_NestedMacroInstantiations 0x40 } ;
+
+FUNCTION: uint clang_defaultEditingTranslationUnitOptions ( ) ;
+FUNCTION: CXTranslationUnit clang_parseTranslationUnit ( CXIndex CIdx,
+ c-string source_filename,
+ char** command_line_args,
+ int num_command_line_args,
+ CXUnsavedFile* unsaved_files,
+ uint num_unsaved_files,
+ uint options ) ;
+
+ENUM: CXSaveTranslationUnit_Flags CXSaveTranslationUnit_None ;
+
+FUNCTION: uint clang_defaultSaveOptions ( CXTranslationUnit TU ) ;
+FUNCTION: int clang_saveTranslationUnit ( CXTranslationUnit TU,
+ c-string FileName,
+ uint options ) ;
+FUNCTION: void clang_disposeTranslationUnit ( CXTranslationUnit ) ;
+
+ENUM: CXReparse_Flags CXReparse_None ;
+
+FUNCTION: uint clang_defaultReparseOptions ( CXTranslationUnit TU ) ;
+FUNCTION: int clang_reparseTranslationUnit ( CXTranslationUnit TU,
+ uint num_unsaved_files,
+ CXUnsavedFile* unsaved_files,
+ uint options ) ;
+
+ENUM: CXTUResourceUsageKind
+ { CXTUResourceUsage_AST 1 }
+ { CXTUResourceUsage_Identifiers 2 }
+ { CXTUResourceUsage_Selectors 3 }
+ { CXTUResourceUsage_GlobalCompletionResults 4 }
+ { CXTUResourceUsage_SourceManagerContentCache 5 }
+ { CXTUResourceUsage_AST_SideTables 6 }
+ { CXTUResourceUsage_SourceManager_Membuffer_Malloc 7 }
+ { CXTUResourceUsage_SourceManager_Membuffer_MMap 8 }
+ { CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc 9 }
+ { CXTUResourceUsage_ExternalASTSource_Membuffer_MMap 10 }
+ { CXTUResourceUsage_Preprocessor 11 }
+ { CXTUResourceUsage_PreprocessingRecord 12 }
+ { CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN 1 }
+ { CXTUResourceUsage_MEMORY_IN_BYTES_END 12 }
+ { CXTUResourceUsage_First 1 }
+ { CXTUResourceUsage_Last 12 } ;
+
+FUNCTION: c-string clang_getTUResourceUsageName ( CXTUResourceUsageKind kind ) ;
+
+STRUCT: CXTUResourceUsageEntry
+ { kind CXTUResourceUsageKind }
+ { amount ulong } ;
+
+STRUCT: CXTUResourceUsage
+ { data void* }
+ { numEntries uint }
+ { entries CXTUResourceUsageEntry* } ;
+
+FUNCTION: CXTUResourceUsage clang_getCXTUResourceUsage ( CXTranslationUnit TU ) ;
+FUNCTION: void clang_disposeCXTUResourceUsage ( CXTUResourceUsage usage ) ;
+
+ENUM: CXCursorKind
+ { CXCursor_UnexposedDecl 1 }
+ { CXCursor_StructDecl 2 }
+ { CXCursor_UnionDecl 3 }
+ { CXCursor_ClassDecl 4 }
+ { CXCursor_EnumDecl 5 }
+ { CXCursor_FieldDecl 6 }
+ { CXCursor_EnumConstantDecl 7 }
+ { CXCursor_FunctionDecl 8 }
+ { CXCursor_VarDecl 9 }
+ { CXCursor_ParmDecl 10 }
+ { CXCursor_ObjCInterfaceDecl 11 }
+ { CXCursor_ObjCCategoryDecl 12 }
+ { CXCursor_ObjCProtocolDecl 13 }
+ { CXCursor_ObjCPropertyDecl 14 }
+ { CXCursor_ObjCIvarDecl 15 }
+ { CXCursor_ObjCInstanceMethodDecl 16 }
+ { CXCursor_ObjCClassMethodDecl 17 }
+ { CXCursor_ObjCImplementationDecl 18 }
+ { CXCursor_ObjCCategoryImplDecl 19 }
+ { CXCursor_TypedefDecl 20 }
+ { CXCursor_CXXMethod 21 }
+ { CXCursor_Namespace 22 }
+ { CXCursor_LinkageSpec 23 }
+ { CXCursor_Constructor 24 }
+ { CXCursor_Destructor 25 }
+ { CXCursor_ConversionFunction 26 }
+ { CXCursor_TemplateTypeParameter 27 }
+ { CXCursor_NonTypeTemplateParameter 28 }
+ { CXCursor_TemplateTemplateParameter 29 }
+ { CXCursor_FunctionTemplate 30 }
+ { CXCursor_ClassTemplate 31 }
+ { CXCursor_ClassTemplatePartialSpecialization 32 }
+ { CXCursor_NamespaceAlias 33 }
+ { CXCursor_UsingDirective 34 }
+ { CXCursor_UsingDeclaration 35 }
+ { CXCursor_TypeAliasDecl 36 }
+ { CXCursor_FirstDecl 1 }
+ { CXCursor_LastDecl 36 }
+ { CXCursor_FirstRef 40 }
+ { CXCursor_ObjCSuperClassRef 40 }
+ { CXCursor_ObjCProtocolRef 41 }
+ { CXCursor_ObjCClassRef 42 }
+ { CXCursor_TypeRef 43 }
+ { CXCursor_CXXBaseSpecifier 44 }
+ { CXCursor_TemplateRef 45 }
+ { CXCursor_NamespaceRef 46 }
+ { CXCursor_MemberRef 47 }
+ { CXCursor_LabelRef 48 }
+ { CXCursor_OverloadedDeclRef 49 }
+ { CXCursor_LastRef 49 }
+ { CXCursor_FirstInvalid 70 }
+ { CXCursor_InvalidFile 70 }
+ { CXCursor_NoDeclFound 71 }
+ { CXCursor_NotImplemented 72 }
+ { CXCursor_InvalidCode 73 }
+ { CXCursor_LastInvalid 73 }
+ { CXCursor_FirstExpr 100 }
+ { CXCursor_UnexposedExpr 100 }
+ { CXCursor_DeclRefExpr 101 }
+ { CXCursor_MemberRefExpr 102 }
+ { CXCursor_CallExpr 103 }
+ { CXCursor_ObjCMessageExpr 104 }
+ { CXCursor_BlockExpr 105 }
+ { CXCursor_LastExpr 105 }
+ { CXCursor_FirstStmt 200 }
+ { CXCursor_UnexposedStmt 200 }
+ { CXCursor_LabelStmt 201 }
+ { CXCursor_LastStmt 201 }
+ { CXCursor_TranslationUnit 300 }
+ { CXCursor_FirstAttr 400 }
+ { CXCursor_UnexposedAttr 400 }
+ { CXCursor_IBActionAttr 401 }
+ { CXCursor_IBOutletAttr 402 }
+ { CXCursor_IBOutletCollectionAttr 403 }
+ { CXCursor_LastAttr 403 }
+ { CXCursor_PreprocessingDirective 500 }
+ { CXCursor_MacroDefinition 501 }
+ { CXCursor_MacroInstantiation 502 }
+ { CXCursor_InclusionDirective 503 }
+ { CXCursor_FirstPreprocessing 500 }
+ { CXCursor_LastPreprocessing 503 } ;
+
+STRUCT: CXCursor
+ { kind CXCursorKind }
+ { data void*[3] } ;
+
+FUNCTION: CXCursor clang_getNullCursor ( ) ;
+FUNCTION: CXCursor clang_getTranslationUnitCursor ( CXTranslationUnit ) ;
+FUNCTION: uint clang_equalCursors ( CXCursor c1, CXCursor c2 ) ;
+FUNCTION: uint clang_hashCursor ( CXCursor ) ;
+FUNCTION: CXCursorKind clang_getCursorKind ( CXCursor ) ;
+FUNCTION: uint clang_isDeclaration ( CXCursorKind ) ;
+FUNCTION: uint clang_isReference ( CXCursorKind ) ;
+FUNCTION: uint clang_isExpression ( CXCursorKind ) ;
+FUNCTION: uint clang_isStatement ( CXCursorKind ) ;
+FUNCTION: uint clang_isInvalid ( CXCursorKind ) ;
+FUNCTION: uint clang_isTranslationUnit ( CXCursorKind ) ;
+FUNCTION: uint clang_isPreprocessing ( CXCursorKind ) ;
+FUNCTION: uint clang_isUnexposed ( CXCursorKind ) ;
+
+ENUM: CXLinkageKind
+ CXLinkage_Invalid
+ CXLinkage_NoLinkage
+ CXLinkage_Internal
+ CXLinkage_UniqueExternal
+ CXLinkage_External ;
+
+ENUM: CXLanguageKind
+ CXLanguage_Invalid
+ CXLanguage_C
+ CXLanguage_ObjC
+ CXLanguage_CPlusPlus ;
+
+FUNCTION: CXLinkageKind clang_getCursorLinkage ( CXCursor cursor ) ;
+FUNCTION: CXAvailabilityKind clang_getCursorAvailability ( CXCursor cursor ) ;
+FUNCTION: CXLanguageKind clang_getCursorLanguage ( CXCursor cursor ) ;
+
+C-TYPE: CXCursorSetImpl
+TYPEDEF: CXCursorSetImpl* CXCursorSet
+
+FUNCTION: CXCursorSet clang_createCXCursorSet ( ) ;
+FUNCTION: void clang_disposeCXCursorSet ( CXCursorSet cset ) ;
+FUNCTION: uint clang_CXCursorSet_contains ( CXCursorSet cset, CXCursor cursor ) ;
+FUNCTION: uint clang_CXCursorSet_insert ( CXCursorSet cset, CXCursor cursor ) ;
+FUNCTION: CXCursor clang_getCursorSemanticParent ( CXCursor cursor ) ;
+FUNCTION: CXCursor clang_getCursorLexicalParent ( CXCursor cursor ) ;
+FUNCTION: void clang_getOverriddenCursors ( CXCursor cursor, CXCursor** overridden, uint* num_overridden ) ;
+FUNCTION: void clang_disposeOverriddenCursors ( CXCursor* overridden ) ;
+FUNCTION: CXFile clang_getIncludedFile ( CXCursor cursor ) ;
+FUNCTION: CXCursor clang_getCursor ( CXTranslationUnit TU,
+ CXSourceLocation location ) ;
+FUNCTION: CXSourceLocation clang_getCursorLocation ( CXCursor ) ;
+FUNCTION: CXSourceRange clang_getCursorExtent ( CXCursor ) ;
+
+ENUM: CXTypeKind
+ { CXType_Invalid 0 }
+ { CXType_Unexposed 1 }
+ { CXType_Void 2 }
+ { CXType_Bool 3 }
+ { CXType_Char_U 4 }
+ { CXType_UChar 5 }
+ { CXType_Char16 6 }
+ { CXType_Char32 7 }
+ { CXType_UShort 8 }
+ { CXType_UInt 9 }
+ { CXType_ULong 10 }
+ { CXType_ULongLong 11 }
+ { CXType_UInt128 12 }
+ { CXType_Char_S 13 }
+ { CXType_SChar 14 }
+ { CXType_WChar 15 }
+ { CXType_Short 16 }
+ { CXType_Int 17 }
+ { CXType_Long 18 }
+ { CXType_LongLong 19 }
+ { CXType_Int128 20 }
+ { CXType_Float 21 }
+ { CXType_Double 22 }
+ { CXType_LongDouble 23 }
+ { CXType_NullPtr 24 }
+ { CXType_Overload 25 }
+ { CXType_Dependent 26 }
+ { CXType_ObjCId 27 }
+ { CXType_ObjCClass 28 }
+ { CXType_ObjCSel 29 }
+ { CXType_FirstBuiltin 2 }
+ { CXType_LastBuiltin 29 }
+ { CXType_Complex 100 }
+ { CXType_Pointer 101 }
+ { CXType_BlockPointer 102 }
+ { CXType_LValueReference 103 }
+ { CXType_RValueReference 104 }
+ { CXType_Record 105 }
+ { CXType_Enum 106 }
+ { CXType_Typedef 107 }
+ { CXType_ObjCInterface 108 }
+ { CXType_ObjCObjectPointer 109 }
+ { CXType_FunctionNoProto 110 }
+ { CXType_FunctionProto 111 } ;
+
+STRUCT: CXType
+ { kind CXTypeKind }
+ { data void*[2] } ;
+
+FUNCTION: CXType clang_getCursorType ( CXCursor C ) ;
+FUNCTION: uint clang_equalTypes ( CXType A, CXType B ) ;
+FUNCTION: CXType clang_getCanonicalType ( CXType T ) ;
+FUNCTION: uint clang_isConstQualifiedType ( CXType T ) ;
+FUNCTION: uint clang_isVolatileQualifiedType ( CXType T ) ;
+FUNCTION: uint clang_isRestrictQualifiedType ( CXType T ) ;
+FUNCTION: CXType clang_getPointeeType ( CXType T ) ;
+FUNCTION: CXCursor clang_getTypeDeclaration ( CXType T ) ;
+FUNCTION: CXString clang_getDeclObjCTypeEncoding ( CXCursor C ) ;
+FUNCTION: CXString clang_getTypeKindSpelling ( CXTypeKind K ) ;
+FUNCTION: CXType clang_getResultType ( CXType T ) ;
+FUNCTION: CXType clang_getCursorResultType ( CXCursor C ) ;
+FUNCTION: uint clang_isPODType ( CXType T ) ;
+FUNCTION: uint clang_isVirtualBase ( CXCursor ) ;
+
+ENUM: CX_CXXAccessSpecifier
+ CX_CXXInvalidAccessSpecifier
+ CX_CXXPublic
+ CX_CXXProtected
+ CX_CXXPrivate ;
+
+FUNCTION: CX_CXXAccessSpecifier clang_getCXXAccessSpecifier ( CXCursor ) ;
+FUNCTION: uint clang_getNumOverloadedDecls ( CXCursor cursor ) ;
+FUNCTION: CXCursor clang_getOverloadedDecl ( CXCursor cursor, uint index ) ;
+FUNCTION: CXType clang_getIBOutletCollectionType ( CXCursor ) ;
+
+ENUM: CXChildVisitResult
+ CXChildVisit_Break
+ CXChildVisit_Continue
+ CXChildVisit_Recurse ;
+
+CALLBACK: CXChildVisitResult CXCursorVisitor ( CXCursor cursor,
+ CXCursor parent,
+ CXClientData client_data ) ;
+
+FUNCTION: uint clang_visitChildren ( CXCursor parent,
+ CXCursorVisitor visitor,
+ CXClientData client_data ) ;
+FUNCTION: CXString clang_getCursorUSR ( CXCursor ) ;
+FUNCTION: CXString clang_constructUSR_ObjCClass ( c-string class_name ) ;
+FUNCTION: CXString clang_constructUSR_ObjCCategory ( c-string class_name,
+ c-string category_name ) ;
+FUNCTION: CXString clang_constructUSR_ObjCProtocol ( c-string protocol_name ) ;
+FUNCTION: CXString clang_constructUSR_ObjCIvar ( c-string name,
+ CXString classUSR ) ;
+FUNCTION: CXString clang_constructUSR_ObjCMethod ( c-string name,
+ uint isInstanceMethod,
+ CXString classUSR ) ;
+FUNCTION: CXString clang_constructUSR_ObjCProperty ( c-string property,
+ CXString classUSR ) ;
+FUNCTION: CXString clang_getCursorSpelling ( CXCursor ) ;
+FUNCTION: CXString clang_getCursorDisplayName ( CXCursor ) ;
+FUNCTION: CXCursor clang_getCursorReferenced ( CXCursor ) ;
+FUNCTION: CXCursor clang_getCursorDefinition ( CXCursor ) ;
+FUNCTION: uint clang_isCursorDefinition ( CXCursor ) ;
+FUNCTION: CXCursor clang_getCanonicalCursor ( CXCursor ) ;
+FUNCTION: uint clang_CXXMethod_isStatic ( CXCursor C ) ;
+FUNCTION: uint clang_CXXMethod_isVirtual ( CXCursor C ) ;
+FUNCTION: CXCursorKind clang_getTemplateCursorKind ( CXCursor C ) ;
+FUNCTION: CXCursor clang_getSpecializedCursorTemplate ( CXCursor C ) ;
+
+ENUM: CXTokenKind
+ CXToken_Punctuation
+ CXToken_Keyword
+ CXToken_Identifier
+ CXToken_Literal
+ CXToken_Comment ;
+
+STRUCT: CXToken
+ { int_data uint[4] }
+ { ptr_data void* } ;
+
+FUNCTION: CXTokenKind clang_getTokenKind ( CXToken ) ;
+FUNCTION: CXString clang_getTokenSpelling ( CXTranslationUnit TU,
+ CXToken Token ) ;
+FUNCTION: CXSourceLocation clang_getTokenLocation ( CXTranslationUnit TU,
+ CXToken Token ) ;
+FUNCTION: CXSourceRange clang_getTokenExtent ( CXTranslationUnit TU,
+ CXToken Token ) ;
+FUNCTION: void clang_tokenize ( CXTranslationUnit TU,
+ CXSourceRange Range,
+ CXToken** Tokens,
+ uint* NumTokens ) ;
+FUNCTION: void clang_annotateTokens ( CXTranslationUnit TU,
+ CXToken* Tokens,
+ uint NumTokens,
+ CXCursor* Cursors ) ;
+FUNCTION: void clang_disposeTokens ( CXTranslationUnit TU,
+ CXToken* Tokens,
+ uint NumTokens ) ;
+
+FUNCTION: CXString clang_getCursorKindSpelling ( CXCursorKind Kind ) ;
+FUNCTION: void clang_getDefinitionSpellingAndExtent ( CXCursor cursor,
+ char** startBuf,
+ char** endBuf,
+ uint* startLine,
+ uint* startColumn,
+ uint* endLine,
+ uint* endColumn ) ;
+FUNCTION: void clang_enableStackTraces ( ) ;
+
+CALLBACK: void executeOnThreadCallback ( void* ) ;
+FUNCTION: void clang_executeOnThread ( executeOnThreadCallback* callback,
+ void* user_data,
+ uint stack_size ) ;
+
+TYPEDEF: void* CXCompletionString
+
+STRUCT: CXCompletionResult
+ { CursorKind CXCursorKind }
+ { CompletionString CXCompletionString } ;
+
+ENUM: CXCompletionChunkKind
+ CXCompletionChunk_Optional
+ CXCompletionChunk_TypedText
+ CXCompletionChunk_Text
+ CXCompletionChunk_Placeholder
+ CXCompletionChunk_Informative
+ CXCompletionChunk_CurrentParameter
+ CXCompletionChunk_LeftParen
+ CXCompletionChunk_RightParen
+ CXCompletionChunk_LeftBracket
+ CXCompletionChunk_RightBracket
+ CXCompletionChunk_LeftBrace
+ CXCompletionChunk_RightBrace
+ CXCompletionChunk_LeftAngle
+ CXCompletionChunk_RightAngle
+ CXCompletionChunk_Comma
+ CXCompletionChunk_ResultType
+ CXCompletionChunk_Colon
+ CXCompletionChunk_SemiColon
+ CXCompletionChunk_Equal
+ CXCompletionChunk_HorizontalSpace
+ CXCompletionChunk_VerticalSpace ;
+
+FUNCTION: CXCompletionChunkKind clang_getCompletionChunkKind ( CXCompletionString completion_string,
+ uint chunk_number ) ;
+FUNCTION: CXString clang_getCompletionChunkText ( CXCompletionString completion_string,
+ uint chunk_number ) ;
+FUNCTION: CXCompletionString clang_getCompletionChunkCompletionString ( CXCompletionString completion_string,
+ uint chunk_number ) ;
+FUNCTION: uint clang_getNumCompletionChunks ( CXCompletionString completion_string ) ;
+FUNCTION: uint clang_getCompletionPriority ( CXCompletionString completion_string ) ;
+FUNCTION: CXAvailabilityKind clang_getCompletionAvailability ( CXCompletionString completion_string ) ;
+
+STRUCT: CXCodeCompleteResults
+ { Results CXCompletionResult* }
+ { NumResults uint } ;
+
+ENUM: CXCodeComplete_Flags
+ { CXCodeComplete_IncludeMacros 1 }
+ { CXCodeComplete_IncludeCodePatterns 2 } ;
+
+FUNCTION: uint clang_defaultCodeCompleteOptions ( ) ;
+
+FUNCTION: CXCodeCompleteResults* clang_codeCompleteAt ( CXTranslationUnit TU,
+ c-string complete_filename,
+ uint complete_line,
+ uint complete_column,
+ CXUnsavedFile* unsaved_files,
+ uint num_unsaved_files,
+ uint options ) ;
+
+FUNCTION: void clang_sortCodeCompletionResults ( CXCompletionResult* Results, uint NumResults ) ;
+FUNCTION: void clang_disposeCodeCompleteResults ( CXCodeCompleteResults* Results ) ;
+FUNCTION: uint clang_codeCompleteGetNumDiagnostics ( CXCodeCompleteResults* Results ) ;
+
+FUNCTION: CXDiagnostic clang_codeCompleteGetDiagnostic ( CXCodeCompleteResults* Results,
+ uint Index ) ;
+
+FUNCTION: CXString clang_getClangVersion ( ) ;
+FUNCTION: void clang_toggleCrashRecovery ( uint isEnabled ) ;
+
+CALLBACK: void CXInclusionVisitor ( CXFile included_file,
+ CXSourceLocation* inclusion_stack,
+ uint include_len,
+ CXClientData client_data ) ;
+
+FUNCTION: void clang_getInclusions ( CXTranslationUnit tu,
+ CXInclusionVisitor visitor,
+ CXClientData client_data ) ;
--- /dev/null
+unix
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+
+USING: alien alien.c-types alien.libraries alien.syntax
+combinators kernel sequences system ;
+
+IN: llvm.core
+
+<<
+: add-llvm-library ( name -- )
+ dup {
+ { [ os macosx? ] [ "lib" ".dylib" surround ] }
+ { [ os unix? ] [ "lib" ".so" surround ] }
+ { [ os windows? ] [ ".dll" append ] }
+ } cond cdecl add-library ;
+
+{ "LLVMSystem" "LLVMSupport" "LLVMCore" "LLVMBitReader" }
+[ add-llvm-library ] each
+>>
+
+! llvm-c/Core.h
+
+LIBRARY: LLVMCore
+
+TYPEDEF: uint unsigned
+TYPEDEF: unsigned enum
+
+ENUM: LLVMAttribute
+ { LLVMZExtAttribute 0b1 }
+ { LLVMSExtAttribute 0b10 }
+ { LLVMNoReturnAttribute 0b100 }
+ { LLVMInRegAttribute 0b1000 }
+ { LLVMStructRetAttribute 0b10000 }
+ { LLVMNoUnwindAttribute 0b100000 }
+ { LLVMNoAliasAttribute 0b1000000 }
+ { LLVMByValAttribute 0b10000000 }
+ { LLVMNestAttribute 0b100000000 }
+ { LLVMReadNoneAttribute 0b1000000000 }
+ { LLVMReadOnlyAttribute 0b10000000000 } ;
+
+ENUM: LLVMTypeKind
+ LLVMVoidTypeKind
+ LLVMFloatTypeKind
+ LLVMDoubleTypeKind
+ LLVMX86_FP80TypeKind
+ LLVMFP128TypeKind
+ LLVMPPC_FP128TypeKind
+ LLVMLabelTypeKind
+ LLVMMetadataTypeKind
+ LLVMIntegerTypeKind
+ LLVMFunctionTypeKind
+ LLVMStructTypeKind
+ LLVMArrayTypeKind
+ LLVMPointerTypeKind
+ LLVMOpaqueTypeKind
+ LLVMVectorTypeKind ;
+
+ENUM: LLVMLinkage
+ LLVMExternalLinkage
+ LLVMLinkOnceLinkage
+ LLVMWeakLinkage
+ LLVMAppendingLinkage
+ LLVMInternalLinkage
+ LLVMDLLImportLinkage
+ LLVMDLLExportLinkage
+ LLVMExternalWeakLinkage
+ LLVMGhostLinkage ;
+
+ENUM: LLVMVisibility
+ LLVMDefaultVisibility
+ LLVMHiddenVisibility
+ LLVMProtectedVisibility ;
+
+ENUM: LLVMCallConv
+ { LLVMCCallConv 0 }
+ { LLVMFastCallConv 8 }
+ { LLVMColdCallConv 9 }
+ { LLVMX86StdcallCallConv 64 }
+ { LLVMX86FastcallCallConv 65 } ;
+
+ENUM: LLVMIntPredicate
+ { LLVMIntEQ 32 }
+ { LLVMIntNE 33 }
+ { LLVMIntUGT 34 }
+ { LLVMIntUGE 35 }
+ { LLVMIntULT 36 }
+ { LLVMIntULE 37 }
+ { LLVMIntSGT 38 }
+ { LLVMIntSGE 39 }
+ { LLVMIntSLT 40 }
+ { LLVMIntSLE 41 } ;
+
+ENUM: LLVMRealPredicate
+ LLVMRealPredicateFalse
+ LLVMRealOEQ
+ LLVMRealOGT
+ LLVMRealOGE
+ LLVMRealOLT
+ LLVMRealOLE
+ LLVMRealONE
+ LLVMRealORD
+ LLVMRealUNO
+ LLVMRealUEQ
+ LLVMRealUGT
+ LLVMRealUGE
+ LLVMRealULT
+ LLVMRealULE
+ LLVMRealUNE
+ LLVMRealPredicateTrue ;
+
+! Opaque Types
+
+TYPEDEF: void* LLVMModuleRef
+
+TYPEDEF: void* LLVMPassManagerRef
+
+TYPEDEF: void* LLVMModuleProviderRef
+
+TYPEDEF: void* LLVMTypeRef
+
+TYPEDEF: void* LLVMTypeHandleRef
+
+TYPEDEF: void* LLVMValueRef
+
+TYPEDEF: void* LLVMBasicBlockRef
+
+TYPEDEF: void* LLVMBuilderRef
+
+TYPEDEF: void* LLVMMemoryBufferRef
+
+! Functions
+
+FUNCTION: void LLVMDisposeMessage ( c-string Message ) ;
+
+FUNCTION: LLVMModuleRef LLVMModuleCreateWithName ( c-string ModuleID ) ;
+
+FUNCTION: int LLVMAddTypeName ( LLVMModuleRef M, c-string Name, LLVMTypeRef Ty ) ;
+
+FUNCTION: void LLVMDisposeModule ( LLVMModuleRef M ) ;
+
+FUNCTION: void LLVMDumpModule ( LLVMModuleRef M ) ;
+
+FUNCTION: LLVMModuleProviderRef
+LLVMCreateModuleProviderForExistingModule ( LLVMModuleRef M ) ;
+
+FUNCTION: void LLVMDisposeModuleProvider ( LLVMModuleProviderRef MP ) ;
+
+! Types
+
+! LLVM types conform to the following hierarchy:
+!
+! types:
+! integer type
+! real type
+! function type
+! sequence types:
+! array type
+! pointer type
+! vector type
+! void type
+! label type
+! opaque type
+
+! See llvm::LLVMTypeKind::getTypeID.
+FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty ) ;
+
+! Operations on integer types
+FUNCTION: LLVMTypeRef LLVMInt1Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMInt8Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMInt16Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMInt32Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMInt64Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMIntType ( unsigned NumBits ) ;
+FUNCTION: unsigned LLVMGetIntTypeWidth ( LLVMTypeRef IntegerTy ) ;
+
+! Operations on real types
+FUNCTION: LLVMTypeRef LLVMFloatType ( ) ;
+FUNCTION: LLVMTypeRef LLVMDoubleType ( ) ;
+FUNCTION: LLVMTypeRef LLVMX86FP80Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMFP128Type ( ) ;
+FUNCTION: LLVMTypeRef LLVMPPCFP128Type ( ) ;
+
+! Operations on function types
+FUNCTION: LLVMTypeRef
+LLVMFunctionType ( LLVMTypeRef ReturnType, LLVMTypeRef* ParamTypes, unsigned ParamCount, int IsVarArg ) ;
+FUNCTION: int LLVMIsFunctionVarArg ( LLVMTypeRef FunctionTy ) ;
+FUNCTION: LLVMTypeRef LLVMGetReturnType ( LLVMTypeRef FunctionTy ) ;
+FUNCTION: unsigned LLVMCountParamTypes ( LLVMTypeRef FunctionTy ) ;
+FUNCTION: void LLVMGetParamTypes ( LLVMTypeRef FunctionTy, LLVMTypeRef* Dest ) ;
+
+! Operations on struct types
+FUNCTION: LLVMTypeRef
+LLVMStructType ( LLVMTypeRef* ElementTypes, unsigned ElementCount, int Packed ) ;
+FUNCTION: unsigned LLVMCountStructElementTypes ( LLVMTypeRef StructTy ) ;
+FUNCTION: void LLVMGetStructElementTypes ( LLVMTypeRef StructTy, LLVMTypeRef* Dest ) ;
+FUNCTION: int LLVMIsPackedStruct ( LLVMTypeRef StructTy ) ;
+
+! Operations on array, pointer, and vector types (sequence types)
+FUNCTION: LLVMTypeRef LLVMArrayType ( LLVMTypeRef ElementType, unsigned ElementCount ) ;
+FUNCTION: LLVMTypeRef LLVMPointerType ( LLVMTypeRef ElementType, unsigned AddressSpace ) ;
+FUNCTION: LLVMTypeRef LLVMVectorType ( LLVMTypeRef ElementType, unsigned ElementCount ) ;
+
+FUNCTION: LLVMTypeRef LLVMGetElementType ( LLVMTypeRef Ty ) ;
+FUNCTION: unsigned LLVMGetArrayLength ( LLVMTypeRef ArrayTy ) ;
+FUNCTION: unsigned LLVMGetPointerAddressSpace ( LLVMTypeRef PointerTy ) ;
+FUNCTION: unsigned LLVMGetVectorSize ( LLVMTypeRef VectorTy ) ;
+
+! Operations on other types
+FUNCTION: LLVMTypeRef LLVMVoidType ( ) ;
+FUNCTION: LLVMTypeRef LLVMLabelType ( ) ;
+FUNCTION: LLVMTypeRef LLVMOpaqueType ( ) ;
+
+! Operations on type handles
+FUNCTION: LLVMTypeHandleRef LLVMCreateTypeHandle ( LLVMTypeRef PotentiallyAbstractTy ) ;
+FUNCTION: void LLVMRefineType ( LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy ) ;
+FUNCTION: LLVMTypeRef LLVMResolveTypeHandle ( LLVMTypeHandleRef TypeHandle ) ;
+FUNCTION: void LLVMDisposeTypeHandle ( LLVMTypeHandleRef TypeHandle ) ;
+
+! Types end
+
+FUNCTION: unsigned LLVMCountParams ( LLVMValueRef Fn ) ;
+
+FUNCTION: void LLVMGetParams ( LLVMValueRef Fn, LLVMValueRef* Params ) ;
+
+FUNCTION: LLVMValueRef
+LLVMAddFunction ( LLVMModuleRef M, c-string Name, LLVMTypeRef FunctionTy ) ;
+
+FUNCTION: LLVMValueRef LLVMGetFirstFunction ( LLVMModuleRef M ) ;
+
+FUNCTION: LLVMValueRef LLVMGetNextFunction ( LLVMValueRef Fn ) ;
+
+FUNCTION: unsigned LLVMGetFunctionCallConv ( LLVMValueRef Fn ) ;
+
+FUNCTION: void LLVMSetFunctionCallConv ( LLVMValueRef Fn, unsigned CC ) ;
+
+FUNCTION: LLVMBasicBlockRef
+LLVMAppendBasicBlock ( LLVMValueRef Fn, c-string Name ) ;
+
+FUNCTION: LLVMValueRef LLVMGetBasicBlockParent ( LLVMBasicBlockRef BB ) ;
+
+! Values
+
+FUNCTION: LLVMTypeRef LLVMTypeOf ( LLVMValueRef Val ) ;
+FUNCTION: c-string LLVMGetValueName ( LLVMValueRef Val ) ;
+FUNCTION: void LLVMSetValueName ( LLVMValueRef Val, c-string Name ) ;
+FUNCTION: void LLVMDumpValue ( LLVMValueRef Val ) ;
+
+! Instruction Builders
+
+FUNCTION: LLVMBuilderRef LLVMCreateBuilder ( ) ;
+FUNCTION: void LLVMPositionBuilder
+( LLVMBuilderRef Builder, LLVMBasicBlockRef Block, LLVMValueRef Instr ) ;
+FUNCTION: void LLVMPositionBuilderBefore
+( LLVMBuilderRef Builder, LLVMValueRef Instr ) ;
+FUNCTION: void LLVMPositionBuilderAtEnd
+( LLVMBuilderRef Builder, LLVMBasicBlockRef Block ) ;
+FUNCTION: LLVMBasicBlockRef LLVMGetInsertBlock
+( LLVMBuilderRef Builder ) ;
+FUNCTION: void LLVMClearInsertionPosition
+( LLVMBuilderRef Builder ) ;
+FUNCTION: void LLVMInsertIntoBuilder
+( LLVMBuilderRef Builder, LLVMValueRef Instr ) ;
+FUNCTION: void LLVMDisposeBuilder
+( LLVMBuilderRef Builder ) ;
+
+! IB Terminators
+
+FUNCTION: LLVMValueRef LLVMBuildRetVoid
+( LLVMBuilderRef Builder ) ;
+FUNCTION: LLVMValueRef LLVMBuildRet
+( LLVMBuilderRef Builder, LLVMValueRef V ) ;
+FUNCTION: LLVMValueRef LLVMBuildBr
+( LLVMBuilderRef Builder, LLVMBasicBlockRef Dest ) ;
+FUNCTION: LLVMValueRef LLVMBuildCondBr
+( LLVMBuilderRef Builder, LLVMValueRef If, LLVMBasicBlockRef Then, LLVMBasicBlockRef Else ) ;
+FUNCTION: LLVMValueRef LLVMBuildSwitch
+( LLVMBuilderRef Builder, LLVMValueRef V, LLVMBasicBlockRef Else, unsigned NumCases ) ;
+FUNCTION: LLVMValueRef LLVMBuildInvoke
+( LLVMBuilderRef Builder, LLVMValueRef Fn, LLVMValueRef* Args, unsigned NumArgs,
+ LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildUnwind
+( LLVMBuilderRef Builder ) ;
+FUNCTION: LLVMValueRef LLVMBuildUnreachable
+( LLVMBuilderRef Builder ) ;
+
+! IB Add Case to Switch
+
+FUNCTION: void LLVMAddCase
+( LLVMValueRef Switch, LLVMValueRef OnVal, LLVMBasicBlockRef Dest ) ;
+
+! IB Arithmetic
+
+FUNCTION: LLVMValueRef LLVMBuildAdd
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSub
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildMul
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildUDiv
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSDiv
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFDiv
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildURem
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSRem
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFRem
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildShl
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildLShr
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildAShr
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildAnd
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildOr
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildXor
+( LLVMBuilderRef Builder, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildNeg
+( LLVMBuilderRef Builder, LLVMValueRef V, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildNot
+( LLVMBuilderRef Builder, LLVMValueRef V, c-string Name ) ;
+
+! IB Memory
+
+FUNCTION: LLVMValueRef LLVMBuildMalloc
+( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildArrayMalloc
+( LLVMBuilderRef Builder, LLVMTypeRef Ty, LLVMValueRef Val, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildAlloca
+( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildArrayAlloca
+( LLVMBuilderRef Builder, LLVMTypeRef Ty, LLVMValueRef Val, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFree
+( LLVMBuilderRef Builder, LLVMValueRef PointerVal ) ;
+FUNCTION: LLVMValueRef LLVMBuildLoad
+( LLVMBuilderRef Builder, LLVMValueRef PointerVal, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildStore
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMValueRef Ptr ) ;
+FUNCTION: LLVMValueRef LLVMBuildGEP
+( LLVMBuilderRef B, LLVMValueRef Pointer, LLVMValueRef* Indices,
+ unsigned NumIndices, c-string Name ) ;
+
+! IB Casts
+
+FUNCTION: LLVMValueRef LLVMBuildTrunc
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildZExt
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSExt
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFPToUI
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFPToSI
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildUIToFP
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSIToFP
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFPTrunc
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFPExt
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildPtrToInt
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildIntToPtr
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildBitCast
+( LLVMBuilderRef Builder, LLVMValueRef Val, LLVMTypeRef DestTy, c-string Name ) ;
+
+! IB Comparisons
+
+FUNCTION: LLVMValueRef LLVMBuildICmp
+( LLVMBuilderRef Builder, LLVMIntPredicate Op, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildFCmp
+( LLVMBuilderRef Builder, LLVMRealPredicate Op, LLVMValueRef LHS, LLVMValueRef RHS, c-string Name ) ;
+
+! IB Misc Instructions
+
+FUNCTION: LLVMValueRef LLVMBuildPhi
+( LLVMBuilderRef Builder, LLVMTypeRef Ty, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildCall
+( LLVMBuilderRef Builder, LLVMValueRef Fn, LLVMValueRef* Args, unsigned NumArgs, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildSelect
+( LLVMBuilderRef Builder, LLVMValueRef If, LLVMValueRef Then, LLVMValueRef Else, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildVAArg
+( LLVMBuilderRef Builder, LLVMValueRef List, LLVMTypeRef Ty, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildExtractElement
+( LLVMBuilderRef Builder, LLVMValueRef VecVal, LLVMValueRef Index, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildInsertElement
+( LLVMBuilderRef Builder, LLVMValueRef VecVal, LLVMValueRef EltVal, LLVMValueRef Index, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildShuffleVector
+( LLVMBuilderRef Builder, LLVMValueRef V1, LLVMValueRef V2, LLVMValueRef Mask, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildExtractValue
+( LLVMBuilderRef Builder, LLVMValueRef AggVal, unsigned Index, c-string Name ) ;
+FUNCTION: LLVMValueRef LLVMBuildInsertValue
+( LLVMBuilderRef Builder, LLVMValueRef AggVal, LLVMValueRef EltVal, unsigned Index, c-string Name ) ;
+
+! Memory Buffers/Bit Reader
+
+FUNCTION: int LLVMCreateMemoryBufferWithContentsOfFile
+( c-string Path, LLVMMemoryBufferRef* OutMemBuf, c-string* OutMessage ) ;
+
+FUNCTION: void LLVMDisposeMemoryBuffer ( LLVMMemoryBufferRef MemBuf ) ;
+
+LIBRARY: LLVMBitReader
+
+FUNCTION: int LLVMParseBitcode
+( LLVMMemoryBufferRef MemBuf, LLVMModuleRef* OutModule, c-string* OutMessage ) ;
+
+FUNCTION: int LLVMGetBitcodeModuleProvider
+( LLVMMemoryBufferRef MemBuf, LLVMModuleProviderRef* OutMP, c-string* OutMessage ) ;
--- /dev/null
+not tested
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien alien.c-types alien.libraries alien.syntax kernel
+llvm.core sequences ;
+IN: llvm.engine
+
+<<
+{
+ "LLVMExecutionEngine" "LLVMTarget" "LLVMAnalysis" "LLVMipa"
+ "LLVMTransformUtils" "LLVMScalarOpts" "LLVMCodeGen"
+ "LLVMAsmPrinter" "LLVMSelectionDAG" "LLVMX86CodeGen"
+ "LLVMJIT" "LLVMInterpreter"
+} [ add-llvm-library ] each
+>>
+
+! llvm-c/ExecutionEngine.h
+
+LIBRARY: LLVMExecutionEngine
+
+TYPEDEF: void* LLVMGenericValueRef
+TYPEDEF: void* LLVMExecutionEngineRef
+
+FUNCTION: LLVMGenericValueRef LLVMCreateGenericValueOfInt
+( LLVMTypeRef Ty, ulonglong N, int IsSigned ) ;
+
+FUNCTION: ulonglong LLVMGenericValueToInt
+( LLVMGenericValueRef GenVal, int IsSigned ) ;
+
+FUNCTION: int LLVMCreateExecutionEngine
+( LLVMExecutionEngineRef *OutEE, LLVMModuleProviderRef MP, c-string* OutError ) ;
+
+FUNCTION: int LLVMCreateJITCompiler
+( LLVMExecutionEngineRef* OutJIT, LLVMModuleProviderRef MP, unsigned OptLevel, c-string* OutError ) ;
+
+FUNCTION: void LLVMDisposeExecutionEngine ( LLVMExecutionEngineRef EE ) ;
+
+FUNCTION: void LLVMFreeMachineCodeForFunction ( LLVMExecutionEngineRef EE, LLVMValueRef F ) ;
+
+FUNCTION: void LLVMAddModuleProvider ( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP ) ;
+
+FUNCTION: int LLVMRemoveModuleProvider
+( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP, LLVMModuleRef* OutMod, c-string* OutError ) ;
+
+FUNCTION: int LLVMFindFunction
+( LLVMExecutionEngineRef EE, c-string Name, LLVMValueRef* OutFn ) ;
+
+FUNCTION: void* LLVMGetPointerToGlobal ( LLVMExecutionEngineRef EE, LLVMValueRef Global ) ;
+
+FUNCTION: LLVMGenericValueRef LLVMRunFunction
+( LLVMExecutionEngineRef EE, LLVMValueRef F, unsigned NumArgs, LLVMGenericValueRef* Args ) ;
--- /dev/null
+not tested
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.llvm io.pathnames llvm.invoker llvm.reader tools.test ;
+
+{ 3 } [
+ << "resource:extra/llvm/reader/add.bc" install-bc >> 1 2 add
+] unit-test
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien alien.data arrays assocs compiler.units
+effects io.backend io.pathnames kernel llvm.core llvm.jit
+llvm.reader llvm.types make namespaces sequences
+specialized-arrays vocabs words ;
+QUALIFIED-WITH: alien.c-types c
+SPECIALIZED-ARRAY: c:void*
+IN: llvm.invoker
+
+! get function name, ret type, param types and names
+
+! load module
+! iterate through functions in a module
+
+TUPLE: function name alien return params ;
+
+: params ( llvm-function -- param-list )
+ dup LLVMCountParams c:void* <c-array>
+ [ LLVMGetParams ] keep >array
+ [ [ LLVMGetValueName ] [ LLVMTypeOf tref> ] bi 2array ] map ;
+
+: <function> ( LLVMValueRef -- function )
+ function new
+ over LLVMGetValueName >>name
+ over LLVMTypeOf tref> type>> return>> >>return
+ swap params >>params ;
+
+: (functions) ( llvm-function -- )
+ [ dup , LLVMGetNextFunction (functions) ] when* ;
+
+: functions ( llvm-module -- functions )
+ LLVMGetFirstFunction [ (functions) ] { } make [ <function> ] map ;
+
+: function-effect ( function -- effect )
+ [ params>> keys ] [ return>> void? 0 1 ? ] bi <effect> ;
+
+: install-function ( function -- )
+ dup name>> "alien.llvm" create-vocab drop
+ "alien.llvm" create-word swap
+ [
+ dup name>> function-pointer ,
+ dup return>> c:lookup-c-type ,
+ dup params>> [ second c:lookup-c-type ] map ,
+ cdecl , \ alien-indirect ,
+ ] [ ] make swap function-effect [ define-declared ] with-compilation-unit ;
+
+: install-module ( name -- )
+ current-jit mps>> at [
+ module>> functions [ install-function ] each
+ ] [ "no such module" throw ] if* ;
+
+: install-bc ( path -- )
+ [ normalize-path ] [ file-name ] bi
+ [ load-into-jit ] keep install-module ;
+
+<< "alien.llvm" create-vocab drop >>
--- /dev/null
+not tested
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: destructors llvm.jit llvm.wrappers tools.test ;
+
+{ } [ "test" <module> "test" add-module "test" remove-module ] unit-test
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types alien.data alien.syntax assocs
+destructors kernel llvm.core llvm.engine llvm.wrappers
+namespaces ;
+
+IN: llvm.jit
+
+TUPLE: jit ee mps ;
+
+: empty-engine ( -- engine )
+ "initial-module" <module> <provider> <engine> ;
+
+: <jit> ( -- jit )
+ jit new empty-engine >>ee H{ } clone >>mps ;
+
+: current-jit ( -- jit )
+ \ current-jit global [ drop <jit> ] cache ;
+
+: (remove-functions) ( function -- )
+ current-jit ee>> value>> over LLVMFreeMachineCodeForFunction
+ LLVMGetNextFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
+
+: remove-functions ( module -- )
+ ! free machine code for each function in module
+ LLVMGetFirstFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
+
+: remove-provider ( provider -- )
+ current-jit ee>> value>> swap value>> f void* <ref> f void* <ref>
+ [ LLVMRemoveModuleProvider drop ] 2keep void* deref [ llvm-throw ] when*
+ void* deref module new swap >>value
+ [ value>> remove-functions ] with-disposal ;
+
+: remove-module ( name -- )
+ dup current-jit mps>> at [
+ remove-provider
+ current-jit mps>> delete-at
+ ] [ drop ] if* ;
+
+: add-module ( module name -- )
+ [ <provider> ] dip [ remove-module ] keep
+ current-jit ee>> value>> pick
+ [ [ value>> LLVMAddModuleProvider ] [ t >>disposed drop ] bi ] with-disposal
+ current-jit mps>> set-at ;
+
+: function-pointer ( name -- alien )
+ current-jit ee>> value>> dup
+ rot f void* <ref> [ LLVMFindFunction drop ] keep
+ void* deref LLVMGetPointerToGlobal ;
--- /dev/null
+not tested
--- /dev/null
+define i32 @add(i32 %x, i32 %y) {
+entry:
+ %sum = add i32 %x, %y
+ ret i32 %sum
+}
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types alien.data alien.syntax
+destructors kernel llvm.core llvm.engine llvm.jit llvm.wrappers
+;
+
+IN: llvm.reader
+
+: buffer>module ( buffer -- module )
+ [
+ value>> f void* <ref> f void* <ref>
+ [ LLVMParseBitcode drop ] 2keep
+ void* deref [ llvm-throw ] when* void* deref
+ module new swap >>value
+ ] with-disposal ;
+
+: load-module ( path -- module )
+ <buffer> buffer>module ;
+
+: load-into-jit ( path name -- )
+ [ load-module ] dip add-module ;
--- /dev/null
+not tested
--- /dev/null
+bindings
+not tested
--- /dev/null
+not tested
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel llvm.types sequences tools.test ;
+
+{ T{ integer f 32 } } [ " i32 " parse-type ] unit-test
+{ float } [ " float " parse-type ] unit-test
+{ T{ pointer f f x86_fp80 } } [ " x86_fp80 * " parse-type ] unit-test
+{ T{ vector f f 4 T{ integer f 32 } } } [ " < 4 x i32 > " parse-type ] unit-test
+{ T{ struct f f { float double } f } } [ TYPE: { float , double } ; ] unit-test
+{ T{ array f f 0 float } } [ TYPE: [ 0 x float ] ; ] unit-test
+
+{ label void metadata }
+[ [ " label " " void " " metadata " ] [ parse-type ] each ] unit-test
+
+{ T{ function f f float { float float } t } }
+[ TYPE: float ( float , float , ... ) ; ] unit-test
+
+{ T{ struct f f { float TYPE: i32 (i32)* ; } t } }
+[ TYPE: < { float, i32 (i32)* } > ; ] unit-test
+
+{ t } [ TYPE: i32 ; TYPE: i32 ; [ >tref ] same? ] unit-test
+{ t } [ TYPE: i32 * ; TYPE: i32 * ; [ >tref ] same? ] unit-test
+
+{ TYPE: i32 ; } [ TYPE: i32 ; >tref tref> ] unit-test
+{ TYPE: float ; } [ TYPE: float ; >tref tref> ] unit-test
+{ TYPE: double ; } [ TYPE: double ; >tref tref> ] unit-test
+{ TYPE: x86_fp80 ; } [ TYPE: x86_fp80 ; >tref tref> ] unit-test
+{ TYPE: fp128 ; } [ TYPE: fp128 ; >tref tref> ] unit-test
+{ TYPE: ppc_fp128 ; } [ TYPE: ppc_fp128 ; >tref tref> ] unit-test
+{ TYPE: opaque ; } [ TYPE: opaque ; >tref tref> ] unit-test
+{ TYPE: label ; } [ TYPE: label ; >tref tref> ] unit-test
+{ TYPE: void ; } [ TYPE: void ; >tref tref> ] unit-test
+{ TYPE: i32* ; } [ TYPE: i32* ; >tref tref> ] unit-test
+{ TYPE: < 2 x i32 > ; } [ TYPE: < 2 x i32 > ; >tref tref> ] unit-test
+{ TYPE: [ 0 x i32 ] ; } [ TYPE: [ 0 x i32 ] ; >tref tref> ] unit-test
+{ TYPE: { i32, i32 } ; } [ TYPE: { i32, i32 } ; >tref tref> ] unit-test
+{ TYPE: < { i32, i32 } > ; } [ TYPE: < { i32, i32 } > ; >tref tref> ] unit-test
+{ TYPE: i32 ( i32 ) ; } [ TYPE: i32 ( i32 ) ; >tref tref> ] unit-test
+{ TYPE: \1* ; } [ TYPE: \1* ; >tref tref> ] unit-test
+{ TYPE: { i32, \2* } ; } [ TYPE: { i32, \2* } ; >tref tref> ] unit-test
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types alien.data arrays combinators
+kernel llvm.core locals math.parser math multiline namespaces
+parser peg.ebnf sequences sequences.deep specialized-arrays
+strings vocabs words ;
+SPECIALIZED-ARRAY: void*
+IN: llvm.types
+
+! Type resolution strategy:
+! pass 1:
+! create the type with uprefs mapped to opaque types
+! cache typerefs in enclosing types for pass 2
+! if our type is concrete, then we are done
+!
+! pass 2:
+! wrap our abstract type in a type handle
+! create a second type, using the cached enclosing type info
+! resolve the first type to the second
+!
+GENERIC: (>tref) ( type -- LLVMTypeRef )
+GENERIC: ((tref>)) ( LLVMTypeRef type -- type )
+GENERIC: c-type ( type -- str )
+
+! default implementation for simple types
+M: object ((tref>)) nip ;
+: unsupported-type ( -- )
+ "cannot generate c-type: unsupported llvm type" throw ;
+M: object c-type unsupported-type ;
+
+TUPLE: integer size ;
+C: <integer> integer
+
+M: integer (>tref) size>> LLVMIntType ;
+M: integer ((tref>)) swap LLVMGetIntTypeWidth >>size ;
+M: integer c-type size>> {
+ { 64 [ "longlong" ] }
+ { 32 [ "int" ] }
+ { 16 [ "short" ] }
+ { 8 [ "char" ] }
+ [ unsupported-type ]
+} case ;
+
+SINGLETONS: float double x86_fp80 fp128 ppc_fp128 ;
+
+M: float (>tref) drop LLVMFloatType ;
+M: double (>tref) drop LLVMDoubleType ;
+M: double c-type drop "double" ;
+M: x86_fp80 (>tref) drop LLVMX86FP80Type ;
+M: fp128 (>tref) drop LLVMFP128Type ;
+M: ppc_fp128 (>tref) drop LLVMPPCFP128Type ;
+
+SINGLETONS: opaque label void metadata ;
+
+M: opaque (>tref) drop LLVMOpaqueType ;
+M: label (>tref) drop LLVMLabelType ;
+M: void (>tref) drop LLVMVoidType ;
+M: void c-type drop "void" ;
+M: metadata (>tref) drop
+ "metadata types unsupported by llvm c bindings" throw ;
+
+! enclosing types cache their llvm refs during
+! the first pass, used in the second pass to
+! resolve uprefs
+TUPLE: enclosing cached ;
+
+GENERIC: clean ( type -- )
+GENERIC: clean* ( type -- )
+M: object clean drop ;
+M: enclosing clean f >>cached clean* ;
+
+! builds the stack of types that uprefs need to refer to
+SYMBOL: types
+:: push-type ( type quot: ( type -- LLVMTypeRef ) -- LLVMTypeRef )
+ type types get push
+ type quot call( type -- LLVMTypeRef )
+ types get pop over >>cached drop ;
+
+DEFER: <up-ref>
+:: push-ref ( ref quot: ( LLVMTypeRef -- type ) -- type )
+ ref types get index
+ [ types get length swap - <up-ref> ] [
+ ref types get push
+ ref quot call( LLVMTypeRef -- type )
+ types get pop drop
+ ] if* ;
+
+GENERIC: (>tref)* ( type -- LLVMTypeRef )
+M: enclosing (>tref) [ (>tref)* ] push-type ;
+
+DEFER: type-kind
+GENERIC: (tref>)* ( LLVMTypeRef type -- type )
+M: enclosing ((tref>)) [ (tref>)* ] curry push-ref ;
+
+: (tref>) ( LLVMTypeRef -- type ) dup type-kind ((tref>)) ;
+
+TUPLE: pointer < enclosing type ;
+: <pointer> ( t -- o ) pointer new swap >>type ;
+
+M: pointer (>tref)* type>> (>tref) 0 LLVMPointerType ;
+M: pointer clean* type>> clean ;
+M: pointer (tref>)* swap LLVMGetElementType (tref>) >>type ;
+M: pointer c-type type>> 8 <integer> = "c-string" "void*" ? ;
+
+TUPLE: vector < enclosing size type ;
+: <vector> ( s t -- o )
+ vector new
+ swap >>type swap >>size ;
+
+M: vector (>tref)* [ type>> (>tref) ] [ size>> ] bi LLVMVectorType ;
+M: vector clean* type>> clean ;
+M: vector (tref>)*
+ over LLVMGetElementType (tref>) >>type
+ swap LLVMGetVectorSize >>size ;
+
+TUPLE: struct < enclosing types packed? ;
+: <struct> ( ts p? -- o )
+ struct new
+ swap >>packed? swap >>types ;
+
+M: struct (>tref)*
+ [ types>> [ (>tref) ] map void* >c-array ]
+ [ types>> length ]
+ [ packed?>> 1 0 ? ] tri LLVMStructType ;
+M: struct clean* types>> [ clean ] each ;
+M: struct (tref>)*
+ over LLVMIsPackedStruct 0 = not >>packed?
+ swap dup LLVMCountStructElementTypes void* <c-array>
+ [ LLVMGetStructElementTypes ] keep >array
+ [ (tref>) ] map >>types ;
+
+TUPLE: array < enclosing size type ;
+: <array> ( s t -- o )
+ array new
+ swap >>type swap >>size ;
+
+M: array (>tref)* [ type>> (>tref) ] [ size>> ] bi LLVMArrayType ;
+M: array clean* type>> clean ;
+M: array (tref>)*
+ over LLVMGetElementType (tref>) >>type
+ swap LLVMGetArrayLength >>size ;
+
+SYMBOL: ...
+TUPLE: function < enclosing return params vararg? ;
+: <function> ( ret params var? -- o )
+ function new
+ swap >>vararg? swap >>params swap >>return ;
+
+M: function (>tref)* {
+ [ return>> (>tref) ]
+ [ params>> [ (>tref) ] map void* >c-array ]
+ [ params>> length ]
+ [ vararg?>> 1 0 ? ]
+} cleave LLVMFunctionType ;
+M: function clean* [ return>> clean ] [ params>> [ clean ] each ] bi ;
+M: function (tref>)*
+ over LLVMIsFunctionVarArg 0 = not >>vararg?
+ over LLVMGetReturnType (tref>) >>return
+ swap dup LLVMCountParamTypes void* <c-array>
+ [ LLVMGetParamTypes ] keep >array
+ [ (tref>) ] map >>params ;
+
+: type-kind ( LLVMTypeRef -- class )
+ LLVMGetTypeKind {
+ { LLVMVoidTypeKind [ void ] }
+ { LLVMFloatTypeKind [ float ] }
+ { LLVMDoubleTypeKind [ double ] }
+ { LLVMX86_FP80TypeKind [ x86_fp80 ] }
+ { LLVMFP128TypeKind [ fp128 ] }
+ { LLVMPPC_FP128TypeKind [ ppc_fp128 ] }
+ { LLVMLabelTypeKind [ label ] }
+ { LLVMIntegerTypeKind [ integer new ] }
+ { LLVMFunctionTypeKind [ function new ] }
+ { LLVMStructTypeKind [ struct new ] }
+ { LLVMArrayTypeKind [ array new ] }
+ { LLVMPointerTypeKind [ pointer new ] }
+ { LLVMOpaqueTypeKind [ opaque ] }
+ { LLVMVectorTypeKind [ vector new ] }
+ } case ;
+
+TUPLE: up-ref height ;
+C: <up-ref> up-ref
+
+M: up-ref (>tref)
+ types get length swap height>> - types get nth
+ cached>> [ LLVMOpaqueType ] unless* ;
+
+: resolve-types ( typeref typeref -- typeref )
+ over LLVMCreateTypeHandle [ LLVMRefineType ] dip
+ [ LLVMResolveTypeHandle ] keep LLVMDisposeTypeHandle ;
+
+: >tref-caching ( type -- LLVMTypeRef )
+ V{ } clone types [ (>tref) ] with-variable ;
+
+: >tref ( type -- LLVMTypeRef )
+ [ >tref-caching ] [ >tref-caching ] [ clean ] tri
+ 2dup = [ drop ] [ resolve-types ] if ;
+
+: tref> ( LLVMTypeRef -- type )
+ V{ } clone types [ (tref>) ] with-variable ;
+
+: t. ( type -- )
+ >tref
+ "type-info" LLVMModuleCreateWithName
+ [ "t" rot LLVMAddTypeName drop ]
+ [ LLVMDumpModule ]
+ [ LLVMDisposeModule ] tri ;
+
+EBNF: parse-type
+
+WhiteSpace = " "*
+
+Zero = "0" => [[ drop 0 ]]
+LeadingDigit = [1-9]
+DecimalDigit = [0-9]
+Number = LeadingDigit:d (DecimalDigit)*:ds => [[ ds d prefix string>number ]]
+WhiteNumberSpace = WhiteSpace Number:n WhiteSpace => [[ n ]]
+WhiteZeroSpace = WhiteSpace (Zero | Number):n WhiteSpace => [[ n ]]
+
+Integer = "i" Number:n => [[ n <integer> ]]
+FloatingPoint = ( "float" | "double" | "x86_fp80" | "fp128" | "ppc_fp128" ) => [[ "llvm.types" vocab lookup-word ]]
+LabelVoidMetadata = ( "label" | "void" | "metadata" | "opaque" ) => [[ "llvm.types" vocab lookup-word ]]
+Primitive = LabelVoidMetadata | FloatingPoint
+Pointer = T:t WhiteSpace "*" => [[ t <pointer> ]]
+Vector = "<" WhiteNumberSpace:n "x" Type:t ">" => [[ n t <vector> ]]
+StructureTypesList = "," Type:t => [[ t ]]
+Structure = "{" Type:t (StructureTypesList)*:ts "}" => [[ ts t prefix >array f <struct> ]]
+Array = "[" WhiteZeroSpace:n "x" Type:t "]" => [[ n t <array> ]]
+NoFunctionParams = "(" WhiteSpace ")" => [[ drop { } ]]
+VarArgs = WhiteSpace "..." WhiteSpace => [[ drop ... ]]
+ParamListContinued = "," (Type | VarArgs):t => [[ t ]]
+ParamList = "(" Type:t (ParamListContinued*):ts ")" => [[ ts t prefix ]]
+Function = T:t WhiteSpace ( ParamList | NoFunctionParams ):ts => [[ ... ts member? dup [ ... ts remove! drop ] when t ts >array rot <function> ]]
+PackedStructure = "<" WhiteSpace "{" Type:ty (StructureTypesList)*:ts "}" WhiteSpace ">" => [[ ts ty prefix >array t <struct> ]]
+UpReference = "\\" Number:n => [[ n <up-ref> ]]
+Name = '%' ([a-zA-Z][a-zA-Z0-9]*):id => [[ id flatten >string ]]
+
+T = Pointer | Function | Primitive | Integer | Vector | Structure | PackedStructure | Array | UpReference | Name
+
+Type = WhiteSpace T:t WhiteSpace => [[ t ]]
+
+Program = Type
+
+;EBNF
+
+SYNTAX: TYPE: ";" parse-multiline-string parse-type suffix! ;
--- /dev/null
+not tested
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: destructors kernel llvm.wrappers sequences tools.test vocabs ;
+
+{ } [ "test" <module> dispose ] unit-test
+{ } [ "test" <module> <provider> dispose ] unit-test
+{ } [ "llvm.jit" vocabs member? [ "test" <module> <provider> <engine> dispose ] unless ] unit-test
--- /dev/null
+! Copyright (C) 2009 Matthew Willis.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types alien.data alien.strings
+io.encodings.utf8 destructors kernel
+llvm.core llvm.engine ;
+
+IN: llvm.wrappers
+
+: llvm-throw ( c-string -- )
+ [ utf8 alien>string ] [ LLVMDisposeMessage ] bi throw ;
+
+: <dispose> ( alien class -- disposable ) new swap >>value ;
+
+TUPLE: module value disposed ;
+M: module dispose* value>> LLVMDisposeModule ;
+
+: <module> ( name -- module )
+ LLVMModuleCreateWithName module <dispose> ;
+
+TUPLE: provider value module disposed ;
+M: provider dispose* value>> LLVMDisposeModuleProvider ;
+
+: (provider) ( module -- provider )
+ [ value>> LLVMCreateModuleProviderForExistingModule provider <dispose> ]
+ [ t >>disposed value>> ] bi
+ >>module ;
+
+: <provider> ( module -- provider )
+ [ (provider) ] with-disposal ;
+
+TUPLE: engine value disposed ;
+M: engine dispose* value>> LLVMDisposeExecutionEngine ;
+
+: (engine) ( provider -- engine )
+ [
+ value>> f void* <ref> f void* <ref>
+ [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep
+ void* deref [ llvm-throw ] when* void* deref
+ ]
+ [ t >>disposed drop ] bi
+ engine <dispose> ;
+
+: <engine> ( provider -- engine )
+ [ (engine) ] with-disposal ;
+
+: (add-block) ( name -- basic-block )
+ "function" swap LLVMAppendBasicBlock ;
+
+TUPLE: builder value disposed ;
+M: builder dispose* value>> LLVMDisposeBuilder ;
+
+: <builder> ( name -- builder )
+ (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
+ builder <dispose> ;
+
+TUPLE: buffer value disposed ;
+M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
+
+: <buffer> ( path -- module )
+ f void* <ref> f void* <ref>
+ [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
+ void* deref [ llvm-throw ] when* void* deref buffer <dispose> ;