diff --git a/src/llvm-c/Analysis.h b/src/llvm-c/Analysis.h index 0e53a3c51..6b93b5c3d 100644 --- a/src/llvm-c/Analysis.h +++ b/src/llvm-c/Analysis.h @@ -19,11 +19,10 @@ #ifndef LLVM_C_ANALYSIS_H #define LLVM_C_ANALYSIS_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCAnalysis Analysis @@ -58,8 +57,6 @@ void LLVMViewFunctionCFGOnly(LLVMValueRef Fn); * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/BitReader.h b/src/llvm-c/BitReader.h index f594e89ed..f7d7de939 100644 --- a/src/llvm-c/BitReader.h +++ b/src/llvm-c/BitReader.h @@ -19,11 +19,10 @@ #ifndef LLVM_C_BITREADER_H #define LLVM_C_BITREADER_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCBitReader Bit Reader @@ -78,8 +77,6 @@ LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM); * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/BitWriter.h b/src/llvm-c/BitWriter.h index 68377bfec..ba4a61afc 100644 --- a/src/llvm-c/BitWriter.h +++ b/src/llvm-c/BitWriter.h @@ -19,11 +19,10 @@ #ifndef LLVM_C_BITWRITER_H #define LLVM_C_BITWRITER_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCBitWriter Bit Writer @@ -52,8 +51,6 @@ LLVMMemoryBufferRef LLVMWriteBitcodeToMemoryBuffer(LLVMModuleRef M); * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Comdat.h b/src/llvm-c/Comdat.h index 8c5f9a63f..b314087fd 100644 --- a/src/llvm-c/Comdat.h +++ b/src/llvm-c/Comdat.h @@ -14,11 +14,10 @@ #ifndef LLVM_C_COMDAT_H #define LLVM_C_COMDAT_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN typedef enum { LLVMAnyComdatSelectionKind, ///< The linker may choose any COMDAT. @@ -68,8 +67,6 @@ LLVMComdatSelectionKind LLVMGetComdatSelectionKind(LLVMComdatRef C); */ void LLVMSetComdatSelectionKind(LLVMComdatRef C, LLVMComdatSelectionKind Kind); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Config/llvm-config.h b/src/llvm-c/Config/llvm-config.h index cdc6d47e7..0303d2867 100644 --- a/src/llvm-c/Config/llvm-config.h +++ b/src/llvm-c/Config/llvm-config.h @@ -66,16 +66,16 @@ #define LLVM_USE_PERF 0 /* Major version of the LLVM API */ -#define LLVM_VERSION_MAJOR 9 +#define LLVM_VERSION_MAJOR 11 /* Minor version of the LLVM API */ #define LLVM_VERSION_MINOR 0 /* Patch version of the LLVM API */ -#define LLVM_VERSION_PATCH 0 +#define LLVM_VERSION_PATCH 1 /* LLVM version string */ -#define LLVM_VERSION_STRING "9.0.0" +#define LLVM_VERSION_STRING "11.0.1" /* Whether LLVM records statistics for use with GetStatistics(), * PrintStatistics() or PrintStatisticsJSON() diff --git a/src/llvm-c/Core.h b/src/llvm-c/Core.h index 88ccaab8a..027c2505f 100644 --- a/src/llvm-c/Core.h +++ b/src/llvm-c/Core.h @@ -16,11 +16,10 @@ #define LLVM_C_CORE_H #include "ErrorHandling.h" +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMC LLVM-C: C interface to LLVM @@ -127,6 +126,7 @@ typedef enum { LLVMShuffleVector = 52, LLVMExtractValue = 53, LLVMInsertValue = 54, + LLVMFreeze = 68, /* Atomic operators */ LLVMFence = 55, @@ -144,23 +144,25 @@ typedef enum { } LLVMOpcode; typedef enum { - LLVMVoidTypeKind, /**< type with no size */ - LLVMHalfTypeKind, /**< 16 bit floating point type */ - LLVMFloatTypeKind, /**< 32 bit floating point type */ - LLVMDoubleTypeKind, /**< 64 bit floating point type */ - LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */ - LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/ - LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */ - LLVMLabelTypeKind, /**< Labels */ - LLVMIntegerTypeKind, /**< Arbitrary bit width integers */ - LLVMFunctionTypeKind, /**< Functions */ - LLVMStructTypeKind, /**< Structures */ - LLVMArrayTypeKind, /**< Arrays */ - LLVMPointerTypeKind, /**< Pointers */ - LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */ - LLVMMetadataTypeKind, /**< Metadata */ - LLVMX86_MMXTypeKind, /**< X86 MMX */ - LLVMTokenTypeKind /**< Tokens */ + LLVMVoidTypeKind, /**< type with no size */ + LLVMHalfTypeKind, /**< 16 bit floating point type */ + LLVMFloatTypeKind, /**< 32 bit floating point type */ + LLVMDoubleTypeKind, /**< 64 bit floating point type */ + LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */ + LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/ + LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */ + LLVMLabelTypeKind, /**< Labels */ + LLVMIntegerTypeKind, /**< Arbitrary bit width integers */ + LLVMFunctionTypeKind, /**< Functions */ + LLVMStructTypeKind, /**< Structures */ + LLVMArrayTypeKind, /**< Arrays */ + LLVMPointerTypeKind, /**< Pointers */ + LLVMVectorTypeKind, /**< Fixed width SIMD vector type */ + LLVMMetadataTypeKind, /**< Metadata */ + LLVMX86_MMXTypeKind, /**< X86 MMX */ + LLVMTokenTypeKind, /**< Tokens */ + LLVMScalableVectorTypeKind, /**< Scalable SIMD vector type */ + LLVMBFloatTypeKind /**< 16 bit brain floating point type */ } LLVMTypeKind; typedef enum { @@ -370,9 +372,13 @@ typedef enum { LLVMAtomicRMWBinOpUMax, /**< Sets the value if it's greater than the original using an unsigned comparison and return the old one */ - LLVMAtomicRMWBinOpUMin /**< Sets the value if it's greater than the - original using an unsigned comparison and return - the old one */ + LLVMAtomicRMWBinOpUMin, /**< Sets the value if it's greater than the + original using an unsigned comparison and return + the old one */ + LLVMAtomicRMWBinOpFAdd, /**< Add a floating point value and return the + old one */ + LLVMAtomicRMWBinOpFSub /**< Subtract a floating point value and return the + old one */ } LLVMAtomicRMWBinOp; typedef enum { @@ -1158,6 +1164,11 @@ unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy); */ LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C); +/** + * Obtain a 16-bit brain floating point type from a context. + */ +LLVMTypeRef LLVMBFloatTypeInContext(LLVMContextRef C); + /** * Obtain a 32-bit floating point type from a context. */ @@ -1190,6 +1201,7 @@ LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C); * These map to the functions in this group of the same name. */ LLVMTypeRef LLVMHalfType(void); +LLVMTypeRef LLVMBFloatType(void); LLVMTypeRef LLVMFloatType(void); LLVMTypeRef LLVMDoubleType(void); LLVMTypeRef LLVMX86FP80Type(void); @@ -1539,6 +1551,7 @@ LLVMTypeRef LLVMX86MMXType(void); macro(GlobalVariable) \ macro(UndefValue) \ macro(Instruction) \ + macro(UnaryOperator) \ macro(BinaryOperator) \ macro(CallInst) \ macro(IntrinsicInst) \ @@ -1571,6 +1584,8 @@ LLVMTypeRef LLVMX86MMXType(void); macro(ResumeInst) \ macro(CleanupReturnInst) \ macro(CatchReturnInst) \ + macro(CatchSwitchInst) \ + macro(CallBrInst) \ macro(FuncletPadInst) \ macro(CatchPadInst) \ macro(CleanupPadInst) \ @@ -1592,7 +1607,11 @@ LLVMTypeRef LLVMX86MMXType(void); macro(ZExtInst) \ macro(ExtractValueInst) \ macro(LoadInst) \ - macro(VAArgInst) + macro(VAArgInst) \ + macro(FreezeInst) \ + macro(AtomicCmpXchgInst) \ + macro(AtomicRMWInst) \ + macro(FenceInst) /** * @defgroup LLVMCCoreValueGeneral General APIs @@ -3240,8 +3259,8 @@ LLVMTypeRef LLVMGetCalledFunctionType(LLVMValueRef C); * This expects an LLVMValueRef that corresponds to a llvm::CallInst or * llvm::InvokeInst. * - * @see llvm::CallInst::getCalledValue() - * @see llvm::InvokeInst::getCalledValue() + * @see llvm::CallInst::getCalledOperand() + * @see llvm::InvokeInst::getCalledOperand() */ LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr); @@ -3617,7 +3636,7 @@ void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest); /* Get the number of clauses on the landingpad instruction */ unsigned LLVMGetNumClauses(LLVMValueRef LandingPad); -/* Get the value of the clause at idnex Idx on the landingpad instruction */ +/* Get the value of the clause at index Idx on the landingpad instruction */ LLVMValueRef LLVMGetClause(LLVMValueRef LandingPad, unsigned Idx); /* Add a catch or filter clause to the landingpad instruction */ @@ -3807,8 +3826,12 @@ LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str, const char *Name); LLVMBool LLVMGetVolatile(LLVMValueRef MemoryAccessInst); void LLVMSetVolatile(LLVMValueRef MemoryAccessInst, LLVMBool IsVolatile); +LLVMBool LLVMGetWeak(LLVMValueRef CmpXchgInst); +void LLVMSetWeak(LLVMValueRef CmpXchgInst, LLVMBool IsWeak); LLVMAtomicOrdering LLVMGetOrdering(LLVMValueRef MemoryAccessInst); void LLVMSetOrdering(LLVMValueRef MemoryAccessInst, LLVMAtomicOrdering Ordering); +LLVMAtomicRMWBinOp LLVMGetAtomicRMWBinOp(LLVMValueRef AtomicRMWInst); +void LLVMSetAtomicRMWBinOp(LLVMValueRef AtomicRMWInst, LLVMAtomicRMWBinOp BinOp); /* Casts */ LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val, @@ -3893,6 +3916,8 @@ LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal, LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal, LLVMValueRef EltVal, unsigned Index, const char *Name); +LLVMValueRef LLVMBuildFreeze(LLVMBuilderRef, LLVMValueRef Val, + const char *Name); LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val, const char *Name); @@ -3912,6 +3937,26 @@ LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr, LLVMAtomicOrdering FailureOrdering, LLVMBool SingleThread); +/** + * Get the number of elements in the mask of a ShuffleVector instruction. + */ +unsigned LLVMGetNumMaskElements(LLVMValueRef ShuffleVectorInst); + +/** + * \returns a constant that specifies that the result of a \c ShuffleVectorInst + * is undefined. + */ +int LLVMGetUndefMaskElem(void); + +/** + * Get the mask value at position Elt in the mask of a ShuffleVector + * instruction. + * + * \Returns the result of \c LLVMGetUndefMaskElem() if the mask value is undef + * at that position. + */ +int LLVMGetMaskValue(LLVMValueRef ShuffleVectorInst, unsigned Elt); + LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst); void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool SingleThread); @@ -4072,8 +4117,6 @@ LLVMBool LLVMIsMultithreaded(void); * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif /* LLVM_C_CORE_H */ diff --git a/src/llvm-c/DataTypes.h b/src/llvm-c/DataTypes.h index 893b22b49..0f27ba818 100644 --- a/src/llvm-c/DataTypes.h +++ b/src/llvm-c/DataTypes.h @@ -24,12 +24,6 @@ #ifndef LLVM_C_DATATYPES_H #define LLVM_C_DATATYPES_H -#ifdef __cplusplus -#include -#else -#include -#endif - #include #include diff --git a/src/llvm-c/DebugInfo.h b/src/llvm-c/DebugInfo.h index f20137902..6f8b16d17 100644 --- a/src/llvm-c/DebugInfo.h +++ b/src/llvm-c/DebugInfo.h @@ -17,10 +17,9 @@ #define LLVM_C_DEBUGINFO_H #include "Core.h" +#include "ExternC.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * Debug info flags. @@ -32,7 +31,7 @@ typedef enum { LLVMDIFlagPublic = 3, LLVMDIFlagFwdDecl = 1 << 2, LLVMDIFlagAppleBlock = 1 << 3, - LLVMDIFlagBlockByrefStruct = 1 << 4, + LLVMDIFlagReservedBit4 = 1 << 4, LLVMDIFlagVirtual = 1 << 5, LLVMDIFlagArtificial = 1 << 6, LLVMDIFlagExplicit = 1 << 7, @@ -169,6 +168,19 @@ typedef unsigned LLVMMetadataKind; */ typedef unsigned LLVMDWARFTypeEncoding; +/** + * Describes the kind of macro declaration used for LLVMDIBuilderCreateMacro. + * @see llvm::dwarf::MacinfoRecordType + * @note Values are from DW_MACINFO_* constants in the DWARF specification. + */ +typedef enum { + LLVMDWARFMacinfoRecordTypeDefine = 0x01, + LLVMDWARFMacinfoRecordTypeMacro = 0x02, + LLVMDWARFMacinfoRecordTypeStartFile = 0x03, + LLVMDWARFMacinfoRecordTypeEndFile = 0x04, + LLVMDWARFMacinfoRecordTypeVendorExt = 0xff +} LLVMDWARFMacinfoRecordType; + /** * The current debug metadata version number. */ @@ -238,6 +250,10 @@ void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder); * \param SplitDebugInlining Whether to emit inline debug info. * \param DebugInfoForProfiling Whether to emit extra debug info for * profile collection. + * \param SysRoot The Clang system root (value of -isysroot). + * \param SysRootLen The length of the C string passed to \c SysRoot. + * \param SDK The SDK. On Darwin, the last component of the sysroot. + * \param SDKLen The length of the C string passed to \c SDK. */ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit( LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, @@ -245,7 +261,8 @@ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit( LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, - LLVMBool DebugInfoForProfiling); + LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, + const char *SDK, size_t SDKLen); /** * Create a file descriptor to hold debugging information for a file. @@ -271,15 +288,15 @@ LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, * \param ConfigMacrosLen The length of the C string passed to \c ConfigMacros. * \param IncludePath The path to the module map file. * \param IncludePathLen The length of the C string passed to \c IncludePath. - * \param ISysRoot The Clang system root (value of -isysroot). - * \param ISysRootLen The length of the C string passed to \c ISysRoot. + * \param APINotesFile The path to an API notes file for the module. + * \param APINotesFileLen The length of the C string passed to \c APINotestFile. */ LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, - const char *ISysRoot, size_t ISysRootLen); + const char *APINotesFile, size_t APINotesFileLen); /** * Creates a new descriptor for a namespace with the specified parent scope. @@ -521,6 +538,38 @@ LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, unsigned NumParameterTypes, LLVMDIFlags Flags); +/** + * Create debugging information entry for a macro. + * @param Builder The DIBuilder. + * @param ParentMacroFile Macro parent (could be NULL). + * @param Line Source line number where the macro is defined. + * @param RecordType DW_MACINFO_define or DW_MACINFO_undef. + * @param Name Macro name. + * @param NameLen Macro name length. + * @param Value Macro value. + * @param ValueLen Macro value length. + */ +LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, + LLVMMetadataRef ParentMacroFile, + unsigned Line, + LLVMDWARFMacinfoRecordType RecordType, + const char *Name, size_t NameLen, + const char *Value, size_t ValueLen); + +/** + * Create debugging information temporary entry for a macro file. + * List of macro node direct children will be calculated by DIBuilder, + * using the \p ParentMacroFile relationship. + * @param Builder The DIBuilder. + * @param ParentMacroFile Macro parent (could be NULL). + * @param Line Source line number where the macro file is included. + * @param File File descriptor containing the name of the macro file. + */ +LLVMMetadataRef +LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, + LLVMMetadataRef ParentMacroFile, unsigned Line, + LLVMMetadataRef File); + /** * Create debugging information entry for an enumerator. * @param Builder The DIBuilder. @@ -830,7 +879,7 @@ LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, - LLVMMetadataRef Scope); + LLVMMetadataRef Scope, uint32_t AlignInBits); /** * Create debugging information entry to establish inheritance relationship @@ -1308,8 +1357,6 @@ void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc); */ LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata); -#ifdef __cplusplus -} /* end extern "C" */ -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Disassembler.h b/src/llvm-c/Disassembler.h index 5cebe5c77..e6642f4ed 100644 --- a/src/llvm-c/Disassembler.h +++ b/src/llvm-c/Disassembler.h @@ -16,6 +16,7 @@ #define LLVM_C_DISASSEMBLER_H #include "DisassemblerTypes.h" +#include "ExternC.h" /** * @defgroup LLVMCDisassembler Disassembler @@ -24,9 +25,7 @@ * @{ */ -#ifdef __cplusplus -extern "C" { -#endif /* !defined(__cplusplus) */ +LLVM_C_EXTERN_C_BEGIN /** * Create a disassembler for the TripleName. Symbolic disassembly is supported @@ -106,8 +105,6 @@ size_t LLVMDisasmInstruction(LLVMDisasmContextRef DC, uint8_t *Bytes, * @} */ -#ifdef __cplusplus -} -#endif /* !defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif /* LLVM_C_DISASSEMBLER_H */ diff --git a/src/llvm-c/Error.h b/src/llvm-c/Error.h index 52943063c..13ada7424 100644 --- a/src/llvm-c/Error.h +++ b/src/llvm-c/Error.h @@ -14,9 +14,9 @@ #ifndef LLVM_C_ERROR_H #define LLVM_C_ERROR_H -#ifdef __cplusplus -extern "C" { -#endif +#include "ExternC.h" + +LLVM_C_EXTERN_C_BEGIN #define LLVMErrorSuccess 0 @@ -62,8 +62,6 @@ void LLVMDisposeErrorMessage(char *ErrMsg); */ LLVMErrorTypeId LLVMGetStringErrorTypeId(void); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/ErrorHandling.h b/src/llvm-c/ErrorHandling.h index 4927349d8..f0ffbfe32 100644 --- a/src/llvm-c/ErrorHandling.h +++ b/src/llvm-c/ErrorHandling.h @@ -14,9 +14,9 @@ #ifndef LLVM_C_ERROR_HANDLING_H #define LLVM_C_ERROR_HANDLING_H -#ifdef __cplusplus -extern "C" { -#endif +#include "ExternC.h" + +LLVM_C_EXTERN_C_BEGIN typedef void (*LLVMFatalErrorHandler)(const char *Reason); @@ -42,8 +42,6 @@ void LLVMResetFatalErrorHandler(void); */ void LLVMEnablePrettyStackTrace(void); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/ExecutionEngine.h b/src/llvm-c/ExecutionEngine.h index 8881116af..8e72faefd 100644 --- a/src/llvm-c/ExecutionEngine.h +++ b/src/llvm-c/ExecutionEngine.h @@ -19,13 +19,12 @@ #ifndef LLVM_C_EXECUTIONENGINE_H #define LLVM_C_EXECUTIONENGINE_H +#include "ExternC.h" #include "Target.h" #include "TargetMachine.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCExecutionEngine Execution Engine @@ -150,6 +149,11 @@ uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name); uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name); +/// Returns true on error, false on success. If true is returned then the error +/// message is copied to OutStr and cleared in the ExecutionEngine instance. +LLVMBool LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE, + char **OutError); + /*===-- Operations on memory managers -------------------------------------===*/ typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)( @@ -193,8 +197,6 @@ LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/IRReader.h b/src/llvm-c/IRReader.h index 80fcdcbba..b266010fd 100644 --- a/src/llvm-c/IRReader.h +++ b/src/llvm-c/IRReader.h @@ -14,11 +14,10 @@ #ifndef LLVM_C_IRREADER_H #define LLVM_C_IRREADER_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * Read LLVM IR from a memory buffer and convert it into an in-memory Module @@ -33,8 +32,6 @@ LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, char **OutMessage); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Initialization.h b/src/llvm-c/Initialization.h index 570131929..048923c3e 100644 --- a/src/llvm-c/Initialization.h +++ b/src/llvm-c/Initialization.h @@ -16,11 +16,10 @@ #ifndef LLVM_C_INITIALIZATION_H #define LLVM_C_INITIALIZATION_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCInitialization Initialization Routines @@ -49,8 +48,6 @@ void LLVMInitializeTarget(LLVMPassRegistryRef R); * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/LinkTimeOptimizer.h b/src/llvm-c/LinkTimeOptimizer.h index 19b4f5cf7..104ac55c1 100644 --- a/src/llvm-c/LinkTimeOptimizer.h +++ b/src/llvm-c/LinkTimeOptimizer.h @@ -15,9 +15,9 @@ #ifndef LLVM_C_LINKTIMEOPTIMIZER_H #define LLVM_C_LINKTIMEOPTIMIZER_H -#ifdef __cplusplus -extern "C" { -#endif +#include "ExternC.h" + +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCLinkTimeOptimizer Link Time Optimization @@ -61,8 +61,6 @@ extern "C" { * @} */ -#ifdef __cplusplus -} -#endif + LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Linker.h b/src/llvm-c/Linker.h index f75a8654f..86e95a38f 100644 --- a/src/llvm-c/Linker.h +++ b/src/llvm-c/Linker.h @@ -14,11 +14,10 @@ #ifndef LLVM_C_LINKER_H #define LLVM_C_LINKER_H +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /* This enum is provided for backwards-compatibility only. It has no effect. */ typedef enum { @@ -34,8 +33,6 @@ typedef enum { */ LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Object.h b/src/llvm-c/Object.h index 72fa185b7..14e00cd86 100644 --- a/src/llvm-c/Object.h +++ b/src/llvm-c/Object.h @@ -19,12 +19,11 @@ #ifndef LLVM_C_OBJECT_H #define LLVM_C_OBJECT_H +#include "ExternC.h" #include "Types.h" #include "Config/llvm-config.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCObject Object file reading and writing @@ -226,8 +225,6 @@ LLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/OrcBindings.h b/src/llvm-c/OrcBindings.h index e6fba9573..107305145 100644 --- a/src/llvm-c/OrcBindings.h +++ b/src/llvm-c/OrcBindings.h @@ -23,12 +23,11 @@ #define LLVM_C_ORCBINDINGS_H #include "Error.h" +#include "ExternC.h" #include "Object.h" #include "TargetMachine.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef; typedef uint64_t LLVMOrcModuleHandle; @@ -165,8 +164,6 @@ void LLVMOrcRegisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventLi */ void LLVMOrcUnregisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L); -#ifdef __cplusplus -} -#endif /* extern "C" */ +LLVM_C_EXTERN_C_END #endif /* LLVM_C_ORCBINDINGS_H */ diff --git a/src/llvm-c/Remarks.h b/src/llvm-c/Remarks.h index 38545342f..548a4041a 100644 --- a/src/llvm-c/Remarks.h +++ b/src/llvm-c/Remarks.h @@ -15,14 +15,16 @@ #ifndef LLVM_C_REMARKS_H #define LLVM_C_REMARKS_H +#include "ExternC.h" #include "Types.h" #ifdef __cplusplus #include -extern "C" { #else #include #endif /* !defined(__cplusplus) */ +LLVM_C_EXTERN_C_BEGIN + /** * @defgroup LLVMCREMARKS Remarks * @ingroup LLVMC @@ -30,7 +32,8 @@ extern "C" { * @{ */ -#define REMARKS_API_VERSION 0 +// 0 -> 1: Bitstream remarks support. +#define REMARKS_API_VERSION 1 /** * The type of the emitted remark. @@ -240,6 +243,20 @@ typedef struct LLVMRemarkOpaqueParser *LLVMRemarkParserRef; extern LLVMRemarkParserRef LLVMRemarkParserCreateYAML(const void *Buf, uint64_t Size); +/** + * Creates a remark parser that can be used to parse the buffer located in \p + * Buf of size \p Size bytes. + * + * \p Buf cannot be `NULL`. + * + * This function should be paired with LLVMRemarkParserDispose() to avoid + * leaking resources. + * + * \since REMARKS_API_VERSION=1 + */ +extern LLVMRemarkParserRef LLVMRemarkParserCreateBitstream(const void *Buf, + uint64_t Size); + /** * Returns the next remark in the file. * @@ -322,8 +339,6 @@ extern uint32_t LLVMRemarkVersion(void); * @} // endgoup LLVMCREMARKS */ -#ifdef __cplusplus -} -#endif /* !defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif /* LLVM_C_REMARKS_H */ diff --git a/src/llvm-c/Support.h b/src/llvm-c/Support.h index 4ad7a511d..2f8c70b6d 100644 --- a/src/llvm-c/Support.h +++ b/src/llvm-c/Support.h @@ -15,11 +15,10 @@ #define LLVM_C_SUPPORT_H #include "DataTypes.h" +#include "ExternC.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * This function permanently loads the dynamic library at the given path. @@ -58,8 +57,6 @@ void *LLVMSearchForAddressOfSymbol(const char *symbolName); */ void LLVMAddSymbol(const char *symbolName, void *symbolValue); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Target.h b/src/llvm-c/Target.h index e0d0c0b29..4d03741c4 100644 --- a/src/llvm-c/Target.h +++ b/src/llvm-c/Target.h @@ -19,12 +19,11 @@ #ifndef LLVM_C_TARGET_H #define LLVM_C_TARGET_H +#include "ExternC.h" #include "Types.h" #include "Config/llvm-config.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTarget Target information @@ -288,8 +287,6 @@ unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/TargetMachine.h b/src/llvm-c/TargetMachine.h index 28f4d1602..4efd8ca08 100644 --- a/src/llvm-c/TargetMachine.h +++ b/src/llvm-c/TargetMachine.h @@ -19,12 +19,12 @@ #ifndef LLVM_C_TARGETMACHINE_H #define LLVM_C_TARGETMACHINE_H +#include "ExternC.h" #include "Target.h" #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN + typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef; typedef struct LLVMTarget *LLVMTargetRef; @@ -156,8 +156,6 @@ char* LLVMGetHostCPUFeatures(void); /** Adds the target-specific analysis passes to the pass manager. */ void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM); -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/AggressiveInstCombine.h b/src/llvm-c/Transforms/AggressiveInstCombine.h index 713de02ac..0d10a6e28 100644 --- a/src/llvm-c/Transforms/AggressiveInstCombine.h +++ b/src/llvm-c/Transforms/AggressiveInstCombine.h @@ -15,11 +15,10 @@ #ifndef LLVM_C_TRANSFORMS_AGGRESSIVEINSTCOMBINE_H #define LLVM_C_TRANSFORMS_AGGRESSIVEINSTCOMBINE_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsAggressiveInstCombine Aggressive Instruction Combining transformations @@ -35,9 +34,7 @@ void LLVMAddAggressiveInstCombinerPass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/Coroutines.h b/src/llvm-c/Transforms/Coroutines.h index aec402552..57fe92103 100644 --- a/src/llvm-c/Transforms/Coroutines.h +++ b/src/llvm-c/Transforms/Coroutines.h @@ -19,11 +19,11 @@ #ifndef LLVM_C_TRANSFORMS_COROUTINES_H #define LLVM_C_TRANSFORMS_COROUTINES_H +#include "../ExternC.h" #include "../Types.h" +#include "PassManagerBuilder.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsCoroutines Coroutine transformations @@ -32,24 +32,25 @@ extern "C" { * @{ */ -/** See llvm::createCoroEarlyPass function. */ +/** See llvm::createCoroEarlyLegacyPass function. */ void LLVMAddCoroEarlyPass(LLVMPassManagerRef PM); -/** See llvm::createCoroSplitPass function. */ +/** See llvm::createCoroSplitLegacyPass function. */ void LLVMAddCoroSplitPass(LLVMPassManagerRef PM); -/** See llvm::createCoroElidePass function. */ +/** See llvm::createCoroElideLegacyPass function. */ void LLVMAddCoroElidePass(LLVMPassManagerRef PM); -/** See llvm::createCoroCleanupPass function. */ +/** See llvm::createCoroCleanupLegacyPass function. */ void LLVMAddCoroCleanupPass(LLVMPassManagerRef PM); +/** See llvm::addCoroutinePassesToExtensionPoints. */ +void LLVMPassManagerBuilderAddCoroutinePassesToExtensionPoints(LLVMPassManagerBuilderRef PMB); + /** * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/IPO.h b/src/llvm-c/Transforms/IPO.h index ebf285331..29c92e730 100644 --- a/src/llvm-c/Transforms/IPO.h +++ b/src/llvm-c/Transforms/IPO.h @@ -15,11 +15,10 @@ #ifndef LLVM_C_TRANSFORMS_IPO_H #define LLVM_C_TRANSFORMS_IPO_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsIPO Interprocedural transformations @@ -34,6 +33,9 @@ void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM); /** See llvm::createConstantMergePass function. */ void LLVMAddConstantMergePass(LLVMPassManagerRef PM); +/** See llvm::createMergeFunctionsPass function. */ +void LLVMAddMergeFunctionsPass(LLVMPassManagerRef PM); + /** See llvm::createCalledValuePropagationPass function. */ void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM); @@ -67,6 +69,21 @@ void LLVMAddIPSCCPPass(LLVMPassManagerRef PM); /** See llvm::createInternalizePass function. */ void LLVMAddInternalizePass(LLVMPassManagerRef, unsigned AllButMain); +/** + * Create and add the internalize pass to the given pass manager with the + * provided preservation callback. + * + * The context parameter is forwarded to the callback on each invocation. + * As such, it is the responsibility of the caller to extend its lifetime + * until execution of this pass has finished. + * + * @see llvm::createInternalizePass function. + */ +void LLVMAddInternalizePassWithMustPreservePredicate( + LLVMPassManagerRef PM, + void *Context, + LLVMBool (*MustPreserve)(LLVMValueRef, void *)); + /** See llvm::createStripDeadPrototypesPass function. */ void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM); @@ -77,8 +94,6 @@ void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/InstCombine.h b/src/llvm-c/Transforms/InstCombine.h index 9f46cda69..3ad5e5838 100644 --- a/src/llvm-c/Transforms/InstCombine.h +++ b/src/llvm-c/Transforms/InstCombine.h @@ -15,11 +15,10 @@ #ifndef LLVM_C_TRANSFORMS_INSTCOMBINE_H #define LLVM_C_TRANSFORMS_INSTCOMBINE_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsInstCombine Instruction Combining transformations @@ -35,9 +34,7 @@ void LLVMAddInstructionCombiningPass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/PassManagerBuilder.h b/src/llvm-c/Transforms/PassManagerBuilder.h index e9332b2dd..498f9c963 100644 --- a/src/llvm-c/Transforms/PassManagerBuilder.h +++ b/src/llvm-c/Transforms/PassManagerBuilder.h @@ -14,13 +14,12 @@ #ifndef LLVM_C_TRANSFORMS_PASSMANAGERBUILDER_H #define LLVM_C_TRANSFORMS_PASSMANAGERBUILDER_H +#include "../ExternC.h" #include "../Types.h" typedef struct LLVMOpaquePassManagerBuilder *LLVMPassManagerBuilderRef; -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsPassManagerBuilder Pass manager builder @@ -83,8 +82,6 @@ void LLVMPassManagerBuilderPopulateLTOPassManager(LLVMPassManagerBuilderRef PMB, * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/Scalar.h b/src/llvm-c/Transforms/Scalar.h index a922d9ae6..2deb43585 100644 --- a/src/llvm-c/Transforms/Scalar.h +++ b/src/llvm-c/Transforms/Scalar.h @@ -19,11 +19,10 @@ #ifndef LLVM_C_TRANSFORMS_SCALAR_H #define LLVM_C_TRANSFORMS_SCALAR_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsScalar Scalar transformations @@ -35,6 +34,9 @@ extern "C" { /** See llvm::createAggressiveDCEPass function. */ void LLVMAddAggressiveDCEPass(LLVMPassManagerRef PM); +/** See llvm::createDeadCodeEliminationPass function. */ +void LLVMAddDCEPass(LLVMPassManagerRef PM); + /** See llvm::createBitTrackingDCEPass function. */ void LLVMAddBitTrackingDCEPass(LLVMPassManagerRef PM); @@ -144,6 +146,9 @@ void LLVMAddEarlyCSEMemSSAPass(LLVMPassManagerRef PM); /** See llvm::createLowerExpectIntrinsicPass function */ void LLVMAddLowerExpectIntrinsicPass(LLVMPassManagerRef PM); +/** See llvm::createLowerConstantIntrinsicsPass function */ +void LLVMAddLowerConstantIntrinsicsPass(LLVMPassManagerRef PM); + /** See llvm::createTypeBasedAliasAnalysisPass function */ void LLVMAddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM); @@ -160,8 +165,6 @@ void LLVMAddUnifyFunctionExitNodesPass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/Utils.h b/src/llvm-c/Transforms/Utils.h index e90c373c6..ac6d0d2ca 100644 --- a/src/llvm-c/Transforms/Utils.h +++ b/src/llvm-c/Transforms/Utils.h @@ -19,11 +19,10 @@ #ifndef LLVM_C_TRANSFORMS_UTILS_H #define LLVM_C_TRANSFORMS_UTILS_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsUtils Transformation Utilities @@ -45,9 +44,7 @@ void LLVMAddAddDiscriminatorsPass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Transforms/Vectorize.h b/src/llvm-c/Transforms/Vectorize.h index 8abb97a35..d7d3a9b6d 100644 --- a/src/llvm-c/Transforms/Vectorize.h +++ b/src/llvm-c/Transforms/Vectorize.h @@ -20,11 +20,10 @@ #ifndef LLVM_C_TRANSFORMS_VECTORIZE_H #define LLVM_C_TRANSFORMS_VECTORIZE_H +#include "../ExternC.h" #include "../Types.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCTransformsVectorize Vectorization transformations @@ -43,8 +42,6 @@ void LLVMAddSLPVectorizePass(LLVMPassManagerRef PM); * @} */ -#ifdef __cplusplus -} -#endif /* defined(__cplusplus) */ +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/Types.h b/src/llvm-c/Types.h index 5c6c0c941..127a46fbf 100644 --- a/src/llvm-c/Types.h +++ b/src/llvm-c/Types.h @@ -15,10 +15,9 @@ #define LLVM_C_TYPES_H #include "DataTypes.h" +#include "ExternC.h" -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * @defgroup LLVMCSupportTypes Types and Enumerations @@ -172,8 +171,6 @@ typedef struct LLVMOpaqueBinary *LLVMBinaryRef; * @} */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif diff --git a/src/llvm-c/lto.h b/src/llvm-c/lto.h index 2467722b1..0c6b9e65a 100644 --- a/src/llvm-c/lto.h +++ b/src/llvm-c/lto.h @@ -16,6 +16,8 @@ #ifndef LLVM_C_LTO_H #define LLVM_C_LTO_H +#include "ExternC.h" + #ifdef __cplusplus #include #else @@ -44,7 +46,7 @@ typedef bool lto_bool_t; * @{ */ -#define LTO_API_VERSION 24 +#define LTO_API_VERSION 27 /** * \since prior to LTO_API_VERSION=3 @@ -98,9 +100,7 @@ typedef struct LLVMOpaqueLTOCodeGenerator *lto_code_gen_t; /** opaque reference to a thin code generator */ typedef struct LLVMOpaqueThinLTOCodeGenerator *thinlto_code_gen_t; -#ifdef __cplusplus -extern "C" { -#endif +LLVM_C_EXTERN_C_BEGIN /** * Returns a printable string. @@ -297,6 +297,21 @@ lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index); extern const char* lto_module_get_linkeropts(lto_module_t mod); +/** + * If targeting mach-o on darwin, this function gets the CPU type and subtype + * that will end up being encoded in the mach-o header. These are the values + * that can be found in mach/machine.h. + * + * \p out_cputype and \p out_cpusubtype must be non-NULL. + * + * Returns true on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=27 + */ +extern lto_bool_t lto_module_get_macho_cputype(lto_module_t mod, + unsigned int *out_cputype, + unsigned int *out_cpusubtype); + /** * Diagnostic severity. * @@ -514,11 +529,24 @@ lto_api_version(void); /** * Sets options to help debug codegen bugs. * + * This function takes one or more options separated by spaces. + * Warning: passing file paths through this function may confuse the argument + * parser if the paths contain spaces. + * * \since prior to LTO_API_VERSION=3 */ extern void lto_codegen_debug_options(lto_code_gen_t cg, const char *); +/** + * Same as the previous function, but takes every option separately through an + * array. + * + * \since prior to LTO_API_VERSION=26 + */ +extern void lto_codegen_debug_options_array(lto_code_gen_t cg, + const char *const *, int number); + /** * Initializes LLVM disassemblers. * FIXME: This doesn't really belong here. @@ -550,6 +578,56 @@ extern void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg, lto_bool_t ShouldEmbedUselists); +/** Opaque reference to an LTO input file */ +typedef struct LLVMOpaqueLTOInput *lto_input_t; + +/** + * Creates an LTO input file from a buffer. The path + * argument is used for diagnotics as this function + * otherwise does not know which file the given buffer + * is associated with. + * + * \since LTO_API_VERSION=24 + */ +extern lto_input_t lto_input_create(const void *buffer, + size_t buffer_size, + const char *path); + +/** + * Frees all memory internally allocated by the LTO input file. + * Upon return the lto_module_t is no longer valid. + * + * \since LTO_API_VERSION=24 + */ +extern void lto_input_dispose(lto_input_t input); + +/** + * Returns the number of dependent library specifiers + * for the given LTO input file. + * + * \since LTO_API_VERSION=24 + */ +extern unsigned lto_input_get_num_dependent_libraries(lto_input_t input); + +/** + * Returns the ith dependent library specifier + * for the given LTO input file. The returned + * string is not null-terminated. + * + * \since LTO_API_VERSION=24 + */ +extern const char * lto_input_get_dependent_library(lto_input_t input, + size_t index, + size_t *size); + +/** + * Returns the list of libcall symbols that can be generated by LTO + * that might not be visible from the symbol table of bitcode files. + * + * \since prior to LTO_API_VERSION=25 + */ +extern const char *const *lto_runtime_lib_symbols_list(size_t *size); + /** * @} // endgoup LLVMCLTO * @defgroup LLVMCTLTO ThinLTO @@ -846,54 +924,10 @@ thinlto_codegen_set_cache_size_megabytes(thinlto_code_gen_t cg, extern void thinlto_codegen_set_cache_size_files(thinlto_code_gen_t cg, unsigned max_size_files); -/** Opaque reference to an LTO input file */ -typedef struct LLVMOpaqueLTOInput *lto_input_t; - -/** - * Creates an LTO input file from a buffer. The path - * argument is used for diagnotics as this function - * otherwise does not know which file the given buffer - * is associated with. - * - * \since LTO_API_VERSION=24 - */ -extern lto_input_t lto_input_create(const void *buffer, - size_t buffer_size, - const char *path); - -/** - * Frees all memory internally allocated by the LTO input file. - * Upon return the lto_module_t is no longer valid. - * - * \since LTO_API_VERSION=24 - */ -extern void lto_input_dispose(lto_input_t input); - -/** - * Returns the number of dependent library specifiers - * for the given LTO input file. - * - * \since LTO_API_VERSION=24 - */ -extern unsigned lto_input_get_num_dependent_libraries(lto_input_t input); - -/** - * Returns the ith dependent library specifier - * for the given LTO input file. The returned - * string is not null-terminated. - * - * \since LTO_API_VERSION=24 - */ -extern const char * lto_input_get_dependent_library(lto_input_t input, - size_t index, - size_t *size); - /** * @} // endgroup LLVMCTLTO_CACHING */ -#ifdef __cplusplus -} -#endif +LLVM_C_EXTERN_C_END #endif /* LLVM_C_LTO_H */