#include "SuppressLLVMWarnings.h" #include "llvm-c/BitReader.h" #include "llvm-c/Core.h" #include "llvm-c/Object.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/Lint.h" #include "llvm/Analysis/Passes.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/JSON.h" #include "llvm/Support/Memory.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Scalar.h" #define LLVM_VERSION_GE(major, minor) \ (LLVM_VERSION_MAJOR > (major) || \ LLVM_VERSION_MAJOR == (major) && LLVM_VERSION_MINOR >= (minor)) #define LLVM_VERSION_LT(major, minor) (!LLVM_VERSION_GE((major), (minor))) #if LLVM_VERSION_GE(20, 0) #include "llvm/Transforms/Utils/Instrumentation.h" #else #include "llvm/Transforms/Instrumentation.h" #endif #include "llvm/IR/LegacyPassManager.h" #include "llvm/Bitcode/BitcodeReader.h" #include "llvm/Bitcode/BitcodeWriter.h" #include "llvm/IR/DIBuilder.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/IRPrintingPasses.h" #include "llvm/Linker/Linker.h" #include "llvm/TargetParser/Triple.h" extern "C" void LLVMRustSetLastError(const char *); enum class LLVMRustResult { Success, Failure }; enum LLVMRustAttribute { AlwaysInline = 0, ByVal = 1, Cold = 2, InlineHint = 3, MinSize = 4, Naked = 5, NoAlias = 6, NoCapture = 7, NoInline = 8, NonNull = 9, NoRedZone = 10, NoReturn = 11, NoUnwind = 12, OptimizeForSize = 13, ReadOnly = 14, SExt = 15, StructRet = 16, UWTable = 17, ZExt = 18, InReg = 19, SanitizeThread = 20, SanitizeAddress = 21, SanitizeMemory = 22, NonLazyBind = 23, OptimizeNone = 24, ReadNone = 26, SanitizeHWAddress = 28, WillReturn = 29, StackProtectReq = 30, StackProtectStrong = 31, StackProtect = 32, NoUndef = 33, SanitizeMemTag = 34, NoCfCheck = 35, ShadowCallStack = 36, AllocSize = 37, AllocatedPointer = 38, AllocAlign = 39, SanitizeSafeStack = 40, FnRetThunkExtern = 41, Writable = 42, DeadOnUnwind = 43, }; typedef struct OpaqueRustString *RustStringRef; typedef struct LLVMOpaqueTwine *LLVMTwineRef; typedef struct LLVMOpaqueSMDiagnostic *LLVMSMDiagnosticRef; extern "C" void LLVMRustStringWriteImpl(RustStringRef Str, const char *Ptr, size_t Size); class RawRustStringOstream : public llvm::raw_ostream { RustStringRef Str; uint64_t Pos; void write_impl(const char *Ptr, size_t Size) override { LLVMRustStringWriteImpl(Str, Ptr, Size); Pos += Size; } uint64_t current_pos() const override { return Pos; } public: explicit RawRustStringOstream(RustStringRef Str) : Str(Str), Pos(0) {} ~RawRustStringOstream() { // LLVM requires this. flush(); } };