Get the project to build with a new dependency setup

This commit is contained in:
Duncan Ogilvie
2026-05-02 17:35:23 +02:00
parent b8870e4cb5
commit c58f357c0f
40 changed files with 5422 additions and 826 deletions
+3
View File
@@ -10,3 +10,6 @@
[submodule "Simplifier"]
path = Simplifier
url = https://github.com/mazeworks-security/Simplifier.git
[submodule "Dna.LLVMInterop/dependencies/remill"]
path = Dna.LLVMInterop/dependencies/remill
url = https://github.com/lifting-bits/remill
+1 -3
View File
@@ -1,9 +1,8 @@
#pragma once
#include <llvm/IR/Module.h>
#include "llvm-c/Transforms/PassManagerBuilder.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Triple.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
#include "llvm/Analysis/GlobalsModRef.h"
@@ -25,7 +24,6 @@
#include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
#include "llvm/Transforms/IPO/FunctionAttrs.h"
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/Scalar.h"
@@ -1,9 +1,8 @@
#pragma once
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
// LLVM's legacy PassManagerBuilder API was removed before LLVM 17.
// Dna.LLVMInterop now uses the new pass manager through llvm/Passes/PassBuilder.h.
// This placeholder remains only to preserve the old project file structure while
// managed callers are migrated away from Dna.LLVMInterop.API.LLVMBindings.Transforms.IPO.
#include <API/ExportDef.h>
using namespace llvm;
using namespace llvm::legacy;
+249 -285
View File
@@ -1,286 +1,250 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{e6a58095-9b8b-4830-bfea-2947c4f2681a}</ProjectGuid>
<RootNamespace>DnaLLVMInterop</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>ClangCL</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>ClangCL</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>C:\Users\colton\source\repos\klee\include;C:\Users\colton\source\repos\DnaOld\Dna\Dna.LLVMInterop\souper\include;C:\Users\colton\source\repos\cxx-common-cmake-win\cxx-common-cmake\build\remill-prefix\src\remill\include;C:\Users\colton\source\repos\DnaOld\Dna\Dna.LLVMInterop;C:\Users\colton\source\repos\cxx-common-cmake-win\cxx-common-cmake\build\install\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\Users\colton\source\repos\cxx-common-cmake-win\cxx-common-cmake\build\install\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<IncludePath>C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpplatest</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>DebugFastLink</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>LLVM-C.lib;LLVMAggressiveInstCombine.lib;LLVMAnalysis.lib;LLVMAsmParser.lib;LLVMAsmPrinter.lib;LLVMBinaryFormat.lib;LLVMBitReader.lib;LLVMBitstreamReader.lib;LLVMBitWriter.lib;LLVMCFGuard.lib;LLVMCFIVerify.lib;LLVMCodeGen.lib;LLVMCore.lib;LLVMCoroutines.lib;LLVMCoverage.lib;LLVMDebugInfoCodeView.lib;LLVMDebuginfod.lib;LLVMDebugInfoDWARF.lib;LLVMDebugInfoGSYM.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoPDB.lib;LLVMDemangle.lib;LLVMDiff.lib;LLVMDlltoolDriver.lib;LLVMDWARFLinker.lib;LLVMDWP.lib;LLVMExecutionEngine.lib;LLVMExegesis.lib;LLVMExegesisAArch64.lib;LLVMExegesisMips.lib;LLVMExegesisPowerPC.lib;LLVMExegesisX86.lib;LLVMExtensions.lib;LLVMFileCheck.lib;LLVMFrontendOpenACC.lib;LLVMFrontendOpenMP.lib;LLVMFuzzerCLI.lib;LLVMFuzzMutate.lib;LLVMGlobalISel.lib;LLVMInstCombine.lib;LLVMInstrumentation.lib;LLVMInterfaceStub.lib;LLVMInterpreter.lib;LLVMipo.lib;LLVMIRReader.lib;LLVMJITLink.lib;LLVMLibDriver.lib;LLVMLineEditor.lib;LLVMLinker.lib;LLVMLTO.lib;LLVMMC.lib;LLVMMCA.lib;LLVMMCDisassembler.lib;LLVMMCJIT.lib;LLVMMCParser.lib;LLVMMIRParser.lib;LLVMNVPTXCodeGen.lib;LLVMNVPTXDesc.lib;LLVMNVPTXInfo.lib;LLVMObjCARCOpts.lib;LLVMObjCopy.lib;LLVMObject.lib;LLVMObjectYAML.lib;LLVMOption.lib;LLVMOrcJIT.lib;LLVMOrcShared.lib;LLVMOrcTargetProcess.lib;LLVMPasses.lib;LLVMProfileData.lib;LLVMRemarks.lib;LLVMRuntimeDyld.lib;LLVMScalarOpts.lib;LLVMSelectionDAG.lib;LLVMSupport.lib;LLVMSymbolize.lib;LLVMSystemZAsmParser.lib;LLVMSystemZCodeGen.lib;LLVMSystemZDesc.lib;LLVMSystemZDisassembler.lib;LLVMSystemZInfo.lib;LLVMTableGen.lib;LLVMTableGenGlobalISel.lib;LLVMTarget.lib;LLVMTextAPI.lib;LLVMTransformUtils.lib;LLVMVEAsmParser.lib;LLVMVECodeGen.lib;LLVMVectorize.lib;LLVMVEDesc.lib;LLVMVEDisassembler.lib;LLVMVEInfo.lib;LLVMWindowsDriver.lib;LLVMWindowsManifest.lib;LLVMX86AsmParser.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Disassembler.lib;LLVMX86Info.lib;LLVMX86TargetMCA.lib;LLVMXCoreCodeGen.lib;LLVMXCoreDesc.lib;LLVMXCoreDisassembler.lib;LLVMXCoreInfo.lib;LLVMXRay.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<Optimization>Disabled</Optimization>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalDependencies>clangHandleLLVM.lib;LLVMAArch64AsmParser.lib;LLVMAArch64CodeGen.lib;LLVMAArch64Desc.lib;LLVMAArch64Disassembler.lib;LLVMAArch64Info.lib;LLVMAArch64Utils.lib;LLVMAggressiveInstCombine.lib;LLVMAMDGPUAsmParser.lib;LLVMAMDGPUCodeGen.lib;LLVMAMDGPUDesc.lib;LLVMAMDGPUDisassembler.lib;LLVMAMDGPUInfo.lib;LLVMAMDGPUTargetMCA.lib;LLVMAMDGPUUtils.lib;LLVMAnalysis.lib;LLVMARMAsmParser.lib;LLVMARMCodeGen.lib;LLVMARMDesc.lib;LLVMARMDisassembler.lib;LLVMARMInfo.lib;LLVMARMUtils.lib;LLVMAsmParser.lib;LLVMAsmPrinter.lib;LLVMAVRAsmParser.lib;LLVMAVRCodeGen.lib;LLVMAVRDesc.lib;LLVMAVRDisassembler.lib;LLVMAVRInfo.lib;LLVMBinaryFormat.lib;LLVMBitReader.lib;LLVMBitstreamReader.lib;LLVMBitWriter.lib;LLVMBPFAsmParser.lib;LLVMBPFCodeGen.lib;LLVMBPFDesc.lib;LLVMBPFDisassembler.lib;LLVMBPFInfo.lib;LLVMCFGuard.lib;LLVMCFIVerify.lib;LLVMCodeGen.lib;LLVMCodeGenTypes.lib;LLVMCore.lib;LLVMCoroutines.lib;LLVMCoverage.lib;LLVMDebugInfoBTF.lib;LLVMDebugInfoCodeView.lib;LLVMDebuginfod.lib;LLVMDebugInfoDWARF.lib;LLVMDebugInfoGSYM.lib;LLVMDebugInfoLogicalView.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoPDB.lib;LLVMDemangle.lib;LLVMDiff.lib;LLVMDlltoolDriver.lib;LLVMDWARFLinker.lib;LLVMDWARFLinkerParallel.lib;LLVMDWP.lib;LLVMExecutionEngine.lib;LLVMExegesis.lib;LLVMExegesisAArch64.lib;LLVMExegesisMips.lib;LLVMExegesisPowerPC.lib;LLVMExegesisX86.lib;LLVMExtensions.lib;LLVMFileCheck.lib;LLVMFrontendHLSL.lib;LLVMFrontendOpenACC.lib;LLVMFrontendOpenMP.lib;LLVMFuzzerCLI.lib;LLVMFuzzMutate.lib;LLVMGlobalISel.lib;LLVMHexagonAsmParser.lib;LLVMHexagonCodeGen.lib;LLVMHexagonDesc.lib;LLVMHexagonDisassembler.lib;LLVMHexagonInfo.lib;LLVMInstCombine.lib;LLVMInstrumentation.lib;LLVMInterfaceStub.lib;LLVMInterpreter.lib;LLVMipo.lib;LLVMIRPrinter.lib;LLVMIRReader.lib;LLVMJITLink.lib;LLVMLanaiAsmParser.lib;LLVMLanaiCodeGen.lib;LLVMLanaiDesc.lib;LLVMLanaiDisassembler.lib;LLVMLanaiInfo.lib;LLVMLibDriver.lib;LLVMLineEditor.lib;LLVMLinker.lib;LLVMLoongArchAsmParser.lib;LLVMLoongArchCodeGen.lib;LLVMLoongArchDesc.lib;LLVMLoongArchDisassembler.lib;LLVMLoongArchInfo.lib;LLVMLTO.lib;LLVMMC.lib;LLVMMCA.lib;LLVMMCDisassembler.lib;LLVMMCJIT.lib;LLVMMCParser.lib;LLVMMipsAsmParser.lib;LLVMMipsCodeGen.lib;LLVMMipsDesc.lib;LLVMMipsDisassembler.lib;LLVMMipsInfo.lib;LLVMMIRParser.lib;LLVMMSP430AsmParser.lib;LLVMMSP430CodeGen.lib;LLVMMSP430Desc.lib;LLVMMSP430Disassembler.lib;LLVMMSP430Info.lib;LLVMNVPTXCodeGen.lib;LLVMNVPTXDesc.lib;LLVMNVPTXInfo.lib;LLVMObjCARCOpts.lib;LLVMObjCopy.lib;LLVMObject.lib;LLVMObjectYAML.lib;LLVMOption.lib;LLVMOrcJIT.lib;LLVMOrcShared.lib;LLVMOrcTargetProcess.lib;LLVMPasses.lib;LLVMPowerPCAsmParser.lib;LLVMPowerPCCodeGen.lib;LLVMPowerPCDesc.lib;LLVMPowerPCDisassembler.lib;LLVMPowerPCInfo.lib;LLVMProfileData.lib;LLVMRemarks.lib;LLVMRISCVAsmParser.lib;LLVMRISCVCodeGen.lib;LLVMRISCVDesc.lib;LLVMRISCVDisassembler.lib;LLVMRISCVInfo.lib;LLVMRISCVTargetMCA.lib;LLVMRuntimeDyld.lib;LLVMScalarOpts.lib;LLVMSelectionDAG.lib;LLVMSparcAsmParser.lib;LLVMSparcCodeGen.lib;LLVMSparcDesc.lib;LLVMSparcDisassembler.lib;LLVMSparcInfo.lib;LLVMSupport.lib;LLVMSymbolize.lib;LLVMSystemZAsmParser.lib;LLVMSystemZCodeGen.lib;LLVMSystemZDesc.lib;LLVMSystemZDisassembler.lib;LLVMSystemZInfo.lib;LLVMTableGen.lib;LLVMTableGenCommon.lib;LLVMTableGenGlobalISel.lib;LLVMTarget.lib;LLVMTargetParser.lib;LLVMTextAPI.lib;LLVMTransformUtils.lib;LLVMVEAsmParser.lib;LLVMVECodeGen.lib;LLVMVectorize.lib;LLVMVEDesc.lib;LLVMVEDisassembler.lib;LLVMVEInfo.lib;LLVMWebAssemblyAsmParser.lib;LLVMWebAssemblyCodeGen.lib;LLVMWebAssemblyDesc.lib;LLVMWebAssemblyDisassembler.lib;LLVMWebAssemblyInfo.lib;LLVMWebAssemblyUtils.lib;LLVMWindowsDriver.lib;LLVMWindowsManifest.lib;LLVMX86AsmParser.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Disassembler.lib;LLVMX86Info.lib;LLVMX86TargetMCA.lib;LLVMXCoreCodeGen.lib;LLVMXCoreDesc.lib;LLVMXCoreDisassembler.lib;LLVMXCoreInfo.lib;LLVMXRay.lib;remill_arch.lib;remill_bc.lib;remill_os.lib;remill_version.lib;remill_arch_aarch64.lib;remill_arch_sleigh.lib;remill_arch_sparc32.lib;remill_arch_sparc64.lib;remill_arch_x86.lib;decomp.lib;sla.lib;slaSupport.lib;gflags_static.lib;gflags_nothreads_static.lib;glog.lib;xed.lib;xed-ild.lib;shlwapi.lib;libz3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<StackReserveSize>536870912</StackReserveSize>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\AdhocInstCombinePass.h" />
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\MultiUseCloningPass.h" />
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\OpaqueStackVarEliminationPass.h" />
<ClInclude Include="API\ExportDef.h" />
<ClInclude Include="API\ExportedAPI.h" />
<ClInclude Include="API\ImmutableManagedPair.h" />
<ClInclude Include="API\LLVMC.hpp" />
<ClInclude Include="API\LLVM\Analysis\ConstantFolding.h" />
<ClInclude Include="API\LLVM\Analysis\KnownBits.h" />
<ClInclude Include="API\LLVM\Analysis\LoopInfo.h" />
<ClInclude Include="API\LLVM\Analysis\MemorySSA.h" />
<ClInclude Include="API\LLVM\IR\CFG.h" />
<ClInclude Include="API\LLVM\IR\Dominators.h" />
<ClInclude Include="API\LLVM\IR\LegacyPassManager.h" />
<ClInclude Include="API\LLVM\Pass.h" />
<ClInclude Include="API\LLVM\Transforms\IPO\PassManagerBuilder.h" />
<ClInclude Include="API\LLVM\Transforms\Scalar.h" />
<ClInclude Include="API\ImmutableManagedVector.h" />
<ClInclude Include="API\LLVM\Transforms\Utils.h" />
<ClInclude Include="API\LLVM\Transforms\Utils\Cloning.h" />
<ClInclude Include="API\OptimizationAPI\OptimizationAPI.h" />
<ClInclude Include="API\OptimizationAPI\OptimizationUtils.h" />
<ClInclude Include="API\Passes\Passes.h" />
<ClInclude Include="API\RegionAPI\BaseRegionAPI.h" />
<ClInclude Include="API\RegionAPI\ComplexRegionAPI.h" />
<ClInclude Include="API\RegionAPI\IfThenElseRegionAPI.h" />
<ClInclude Include="API\RegionAPI\IfThenRegionAPI.h" />
<ClInclude Include="API\RegionAPI\RegionAPI.h" />
<ClInclude Include="API\RegionAPI\ReturnRegionAPI.h" />
<ClInclude Include="API\Remill\Arch\Arch.h" />
<ClInclude Include="API\Remill\Arch\Context.h" />
<ClInclude Include="API\Remill\Arch\Instruction.h" />
<ClInclude Include="API\Remill\BC\InstructionLifter.h" />
<ClInclude Include="API\Remill\BC\IntrinsicTable.h" />
<ClInclude Include="API\Remill\BC\Optimizer.h" />
<ClInclude Include="API\Remill\BC\Util.h" />
<ClInclude Include="API\souper\SouperExprBuilder.h" />
<ClInclude Include="API\souper\SouperCandidates.h" />
<ClInclude Include="API\souper\SouperInst.h" />
<ClInclude Include="Arch\X86\X86Registers.h" />
<ClInclude Include="Passes\BoundsSolver.h" />
<ClInclude Include="Passes\ClassifyingAliasAnalysisPass.h" />
<ClInclude Include="Passes\compilercore_assert.h" />
<ClInclude Include="Passes\ConstantConcretizationPass.h" />
<ClInclude Include="Passes\ControlFlowStructuringPass.h" />
<ClInclude Include="Passes\ControlledNodeSplittingPass.h" />
<ClInclude Include="Passes\generator_jit_ast_compute.h" />
<ClInclude Include="Passes\generator_jit_sl_function.h" />
<ClInclude Include="Passes\JumpTableAnalysisPass.h" />
<ClInclude Include="Passes\mdl_assert.h" />
<ClInclude Include="Passes\PassUtilities.h" />
<ClInclude Include="Pipeline\Pipeline.h" />
<ClInclude Include="souper\include\souper\Codegen\Codegen.h" />
<ClInclude Include="souper\include\souper\Extractor\Candidates.h" />
<ClInclude Include="souper\include\souper\Extractor\ExprBuilder.h" />
<ClInclude Include="souper\include\souper\Infer\AbstractInterpreter.h" />
<ClInclude Include="souper\include\souper\Infer\AliveDriver.h" />
<ClInclude Include="souper\include\souper\Infer\ConstantSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\EnumerativeSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\InstSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\Interpreter.h" />
<ClInclude Include="souper\include\souper\Infer\Preconditions.h" />
<ClInclude Include="souper\include\souper\Infer\Pruning.h" />
<ClInclude Include="souper\include\souper\Infer\Verification.h" />
<ClInclude Include="souper\include\souper\Infer\Z3Driver.h" />
<ClInclude Include="souper\include\souper\Infer\Z3Expr.h" />
<ClInclude Include="souper\include\souper\Inst\Inst.h" />
<ClInclude Include="souper\include\souper\Inst\InstGraph.h" />
<ClInclude Include="souper\include\souper\KVStore\KVStore.h" />
<ClInclude Include="souper\include\souper\Parser\Parser.h" />
<ClInclude Include="souper\include\souper\SMTLIB2\Solver.h" />
<ClInclude Include="souper\include\souper\Tool\CandidateMapUtils.h" />
<ClInclude Include="souper\include\souper\Tool\GetSolver.h" />
<ClInclude Include="souper\include\souper\Util\DfaUtils.h" />
<ClInclude Include="souper\include\souper\Util\LLVMUtils.h" />
<ClInclude Include="souper\include\souper\Util\UniqueNameSet.h" />
<ClInclude Include="Utilities\magic_enum.hpp" />
<ClInclude Include="Utilities\magic_enum_containers.hpp" />
<ClInclude Include="Utilities\magic_enum_format.hpp" />
<ClInclude Include="Utilities\magic_enum_fuse.hpp" />
<ClInclude Include="Utilities\magic_enum_switch.hpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\klee\lib\Expr\Expr.cpp" />
<ClCompile Include="..\..\..\klee\lib\Expr\ExprPPrinter.cpp" />
<ClCompile Include="..\..\..\klee\lib\Expr\ExprSMTLIBPrinter.cpp" />
<ClCompile Include="..\..\..\klee\lib\Expr\Updates.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="Passes\ClassifyingAliasAnalysisPass.cpp" />
<ClCompile Include="Passes\compilercore_assert.cpp" />
<ClCompile Include="Passes\ConstantConcretizationPass.cpp" />
<ClCompile Include="Passes\ControlledNodeSplittingPass.cpp" />
<ClCompile Include="Passes\generator_jit_ast_compute.cpp" />
<ClCompile Include="souper\lib\Codegen\Codegen.cpp" />
<ClCompile Include="souper\lib\Codegen\MachineCost.cpp" />
<ClCompile Include="souper\lib\Extractor\Candidates.cpp" />
<ClCompile Include="souper\lib\Extractor\ExprBuilder.cpp" />
<ClCompile Include="souper\lib\Extractor\KLEEBuilder.cpp" />
<ClCompile Include="souper\lib\Extractor\Solver.cpp" />
<ClCompile Include="souper\lib\Infer\AbstractInterpreter.cpp" />
<ClCompile Include="souper\lib\Infer\AliveDriver.cpp" />
<ClCompile Include="souper\lib\Infer\ConstantSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\EnumerativeSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\InstSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\Interpreter.cpp" />
<ClCompile Include="souper\lib\Infer\Preconditions.cpp" />
<ClCompile Include="souper\lib\Infer\Pruning.cpp" />
<ClCompile Include="souper\lib\Infer\Verification.cpp" />
<ClCompile Include="souper\lib\Infer\Z3Driver.cpp" />
<ClCompile Include="souper\lib\Infer\Z3Expr.cpp" />
<ClCompile Include="souper\lib\Inst\Inst.cpp" />
<ClCompile Include="souper\lib\KVStore\KVStore.cpp" />
<ClCompile Include="souper\lib\Parser\Parser.cpp" />
<ClCompile Include="souper\lib\Pass\Pass.cpp" />
<ClCompile Include="souper\lib\SMTLIB2\smtlib_Solver.cpp" />
<ClCompile Include="souper\lib\Tool\CandidateMapUtils.cpp" />
</ItemGroup>
<ItemGroup>
<None Include="souper\include\souper\KVStore\KVSocket.h.in" />
<None Include="souper\include\souper\Tool\GetSolver.h.in" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{e6a58095-9b8b-4830-bfea-2947c4f2681a}</ProjectGuid>
<RootNamespace>DnaLLVMInterop</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>ClangCL</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>ClangCL</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>true</LinkIncremental>
<LinkToolExe>link.exe</LinkToolExe>
<UseLldLink>false</UseLldLink>
<IncludePath>$(ProjectDir)klee\include;$(ProjectDir)souper\include;$(ProjectDir);$(ProjectDir)dependencies\install\include;$(IncludePath)</IncludePath>
<LibraryPath>$(ProjectDir)dependencies\install\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkToolExe>link.exe</LinkToolExe>
<UseLldLink>false</UseLldLink>
<IncludePath>$(ProjectDir)klee\include;$(ProjectDir)souper\include;$(ProjectDir);$(ProjectDir)dependencies\install\include;$(IncludePath)</IncludePath>
<LibraryPath>$(ProjectDir)dependencies\install\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;LLVM_VERSION_MAJOR=17;LLVM_VERSION_MINOR=0;LLVM_VERSION_PATCH=2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpplatest</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>DebugFastLink</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(ProjectDir)dependencies\install\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>/INCLUDE:Z3_mk_int;libz3.lib;LLVMX86AsmParser.lib;LLVMX86Disassembler.lib;LLVMX86TargetMCA.lib;LLVMAArch64AsmParser.lib;LLVMAArch64CodeGen.lib;LLVMAArch64Desc.lib;LLVMAArch64Disassembler.lib;LLVMAArch64Info.lib;LLVMAArch64Utils.lib;LLVMOrcJIT.lib;LLVMWindowsDriver.lib;LLVMJITLink.lib;LLVMOption.lib;LLVMMCJIT.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Info.lib;LLVMMCDisassembler.lib;LLVMGlobalISel.lib;LLVMSelectionDAG.lib;LLVMCFGuard.lib;LLVMAsmPrinter.lib;LLVMExecutionEngine.lib;LLVMInterpreter.lib;LLVMRuntimeDyld.lib;LLVMOrcTargetProcess.lib;LLVMOrcShared.lib;LLVMPasses.lib;LLVMIRPrinter.lib;LLVMCoroutines.lib;LLVMCodeGen.lib;LLVMTarget.lib;LLVMObjCARCOpts.lib;LLVMCodeGenTypes.lib;LLVMipo.lib;LLVMInstrumentation.lib;LLVMVectorize.lib;LLVMLinker.lib;LLVMFrontendOpenMP.lib;LLVMBitWriter.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMAggressiveInstCombine.lib;LLVMTransformUtils.lib;LLVMAnalysis.lib;LLVMProfileData.lib;LLVMSymbolize.lib;LLVMDebugInfoBTF.lib;LLVMDebugInfoPDB.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoDWARF.lib;LLVMObject.lib;LLVMTextAPI.lib;LLVMMCParser.lib;LLVMIRReader.lib;LLVMAsmParser.lib;LLVMMC.lib;LLVMDebugInfoCodeView.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMRemarks.lib;LLVMBitstreamReader.lib;LLVMBinaryFormat.lib;LLVMTargetParser.lib;LLVMSupport.lib;LLVMDemangle.lib;remill_arch.lib;remill_bc.lib;remill_os.lib;remill_version.lib;remill_arch_aarch64.lib;remill_arch_sleigh.lib;remill_arch_sparc32.lib;remill_arch_sparc64.lib;remill_arch_x86.lib;decomp.lib;sla.lib;slaSupport.lib;gflags_static.lib;gflags_nothreads_static.lib;glog.lib;xed.lib;xed-ild.lib;shlwapi.lib;psapi.lib;dbghelp.lib;shell32.lib;ole32.lib;uuid.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;LLVM_VERSION_MAJOR=17;LLVM_VERSION_MINOR=0;LLVM_VERSION_PATCH=2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<Optimization>Disabled</Optimization>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(ProjectDir)dependencies\install\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalDependencies>/INCLUDE:Z3_mk_int;libz3.lib;LLVMX86AsmParser.lib;LLVMX86Disassembler.lib;LLVMX86TargetMCA.lib;LLVMAArch64AsmParser.lib;LLVMAArch64CodeGen.lib;LLVMAArch64Desc.lib;LLVMAArch64Disassembler.lib;LLVMAArch64Info.lib;LLVMAArch64Utils.lib;LLVMOrcJIT.lib;LLVMWindowsDriver.lib;LLVMJITLink.lib;LLVMOption.lib;LLVMMCJIT.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Info.lib;LLVMMCDisassembler.lib;LLVMGlobalISel.lib;LLVMSelectionDAG.lib;LLVMCFGuard.lib;LLVMAsmPrinter.lib;LLVMExecutionEngine.lib;LLVMInterpreter.lib;LLVMRuntimeDyld.lib;LLVMOrcTargetProcess.lib;LLVMOrcShared.lib;LLVMPasses.lib;LLVMIRPrinter.lib;LLVMCoroutines.lib;LLVMCodeGen.lib;LLVMTarget.lib;LLVMObjCARCOpts.lib;LLVMCodeGenTypes.lib;LLVMipo.lib;LLVMInstrumentation.lib;LLVMVectorize.lib;LLVMLinker.lib;LLVMFrontendOpenMP.lib;LLVMBitWriter.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMAggressiveInstCombine.lib;LLVMTransformUtils.lib;LLVMAnalysis.lib;LLVMProfileData.lib;LLVMSymbolize.lib;LLVMDebugInfoBTF.lib;LLVMDebugInfoPDB.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoDWARF.lib;LLVMObject.lib;LLVMTextAPI.lib;LLVMMCParser.lib;LLVMIRReader.lib;LLVMAsmParser.lib;LLVMMC.lib;LLVMDebugInfoCodeView.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMRemarks.lib;LLVMBitstreamReader.lib;LLVMBinaryFormat.lib;LLVMTargetParser.lib;LLVMSupport.lib;LLVMDemangle.lib;remill_arch.lib;remill_bc.lib;remill_os.lib;remill_version.lib;remill_arch_aarch64.lib;remill_arch_sleigh.lib;remill_arch_sparc32.lib;remill_arch_sparc64.lib;remill_arch_x86.lib;decomp.lib;sla.lib;slaSupport.lib;gflags_static.lib;gflags_nothreads_static.lib;glog.lib;xed.lib;xed-ild.lib;shlwapi.lib;psapi.lib;dbghelp.lib;shell32.lib;ole32.lib;uuid.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<StackReserveSize>536870912</StackReserveSize>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\AdhocInstCombinePass.h" />
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\MultiUseCloningPass.h" />
<ClInclude Include="..\..\Devirtualizer\Dna.LLVMInterop\Passes\OpaqueStackVarEliminationPass.h" />
<ClInclude Include="API\ExportDef.h" />
<ClInclude Include="API\ExportedAPI.h" />
<ClInclude Include="API\ImmutableManagedPair.h" />
<ClInclude Include="API\LLVMC.hpp" />
<ClInclude Include="API\LLVM\Analysis\ConstantFolding.h" />
<ClInclude Include="API\LLVM\Analysis\KnownBits.h" />
<ClInclude Include="API\LLVM\Analysis\LoopInfo.h" />
<ClInclude Include="API\LLVM\Analysis\MemorySSA.h" />
<ClInclude Include="API\LLVM\IR\CFG.h" />
<ClInclude Include="API\LLVM\IR\Dominators.h" />
<ClInclude Include="API\LLVM\IR\LegacyPassManager.h" />
<ClInclude Include="API\LLVM\Pass.h" />
<ClInclude Include="API\LLVM\Transforms\IPO\PassManagerBuilder.h" />
<ClInclude Include="API\LLVM\Transforms\Scalar.h" />
<ClInclude Include="API\ImmutableManagedVector.h" />
<ClInclude Include="API\LLVM\Transforms\Utils.h" />
<ClInclude Include="API\LLVM\Transforms\Utils\Cloning.h" />
<ClInclude Include="API\OptimizationAPI\OptimizationAPI.h" />
<ClInclude Include="API\OptimizationAPI\OptimizationUtils.h" />
<ClInclude Include="API\Passes\Passes.h" />
<ClInclude Include="API\RegionAPI\BaseRegionAPI.h" />
<ClInclude Include="API\RegionAPI\ComplexRegionAPI.h" />
<ClInclude Include="API\RegionAPI\IfThenElseRegionAPI.h" />
<ClInclude Include="API\RegionAPI\IfThenRegionAPI.h" />
<ClInclude Include="API\RegionAPI\RegionAPI.h" />
<ClInclude Include="API\RegionAPI\ReturnRegionAPI.h" />
<ClInclude Include="API\Remill\Arch\Arch.h" />
<ClInclude Include="API\Remill\Arch\Context.h" />
<ClInclude Include="API\Remill\Arch\Instruction.h" />
<ClInclude Include="API\Remill\BC\InstructionLifter.h" />
<ClInclude Include="API\Remill\BC\IntrinsicTable.h" />
<ClInclude Include="API\Remill\BC\Optimizer.h" />
<ClInclude Include="API\Remill\BC\Util.h" />
<ClInclude Include="API\souper\SouperExprBuilder.h" />
<ClInclude Include="API\souper\SouperCandidates.h" />
<ClInclude Include="API\souper\SouperInst.h" />
<ClInclude Include="Arch\X86\X86Registers.h" />
<ClInclude Include="Passes\BoundsSolver.h" />
<ClInclude Include="Passes\ClassifyingAliasAnalysisPass.h" />
<ClInclude Include="Passes\compilercore_assert.h" />
<ClInclude Include="Passes\ConstantConcretizationPass.h" />
<ClInclude Include="Passes\ControlFlowStructuringPass.h" />
<ClInclude Include="Passes\ControlledNodeSplittingPass.h" />
<ClInclude Include="Passes\generator_jit_ast_compute.h" />
<ClInclude Include="Passes\generator_jit_sl_function.h" />
<ClInclude Include="Passes\JumpTableAnalysisPass.h" />
<ClInclude Include="Passes\mdl_assert.h" />
<ClInclude Include="Passes\PassUtilities.h" />
<ClInclude Include="Pipeline\Pipeline.h" />
<ClInclude Include="klee\include\klee\Config\config.h" />
<ClInclude Include="klee\include\klee\Config\Version.h" />
<ClInclude Include="klee\include\klee\Constraints.h" />
<ClInclude Include="klee\include\klee\Expr.h" />
<ClInclude Include="klee\include\klee\Internal\Support\IntEvaluation.h" />
<ClInclude Include="klee\include\klee\Solver.h" />
<ClInclude Include="klee\include\klee\util\Bits.h" />
<ClInclude Include="klee\include\klee\util\ExprPPrinter.h" />
<ClInclude Include="klee\include\klee\util\ExprSMTLIBPrinter.h" />
<ClInclude Include="klee\include\klee\util\PrintContext.h" />
<ClInclude Include="klee\include\klee\util\Ref.h" />
<ClInclude Include="souper\include\klee\Config\config.h" />
<ClInclude Include="souper\include\souper\Codegen\Codegen.h" />
<ClInclude Include="souper\include\souper\Extractor\Candidates.h" />
<ClInclude Include="souper\include\souper\Extractor\ExprBuilder.h" />
<ClInclude Include="souper\include\souper\Extractor\Solver.h" />
<ClInclude Include="souper\include\souper\Infer\AbstractInterpreter.h" />
<ClInclude Include="souper\include\souper\Infer\AliveDriver.h" />
<ClInclude Include="souper\include\souper\Infer\ConstantSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\EnumerativeSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\InstSynthesis.h" />
<ClInclude Include="souper\include\souper\Infer\Interpreter.h" />
<ClInclude Include="souper\include\souper\Infer\Preconditions.h" />
<ClInclude Include="souper\include\souper\Infer\Pruning.h" />
<ClInclude Include="souper\include\souper\Infer\Verification.h" />
<ClInclude Include="souper\include\souper\Infer\Z3Driver.h" />
<ClInclude Include="souper\include\souper\Infer\Z3Expr.h" />
<ClInclude Include="souper\include\souper\Inst\Inst.h" />
<ClInclude Include="souper\include\souper\Inst\InstGraph.h" />
<ClInclude Include="souper\include\souper\KVStore\KVStore.h" />
<ClInclude Include="souper\include\souper\Parser\Parser.h" />
<ClInclude Include="souper\include\souper\SMTLIB2\Solver.h" />
<ClInclude Include="souper\include\souper\Tool\CandidateMapUtils.h" />
<ClInclude Include="souper\include\souper\Tool\GetSolver.h" />
<ClInclude Include="souper\include\souper\Util\DfaUtils.h" />
<ClInclude Include="souper\include\souper\Util\LLVMUtils.h" />
<ClInclude Include="souper\include\souper\Util\UniqueNameSet.h" />
<ClInclude Include="Utilities\magic_enum.hpp" />
<ClInclude Include="Utilities\magic_enum_containers.hpp" />
<ClInclude Include="Utilities\magic_enum_format.hpp" />
<ClInclude Include="Utilities\magic_enum_fuse.hpp" />
<ClInclude Include="Utilities\magic_enum_switch.hpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="klee\lib\Expr\Expr.cpp" />
<ClCompile Include="klee\lib\Expr\ExprPPrinter.cpp" />
<ClCompile Include="klee\lib\Expr\ExprSMTLIBPrinter.cpp" />
<ClCompile Include="klee\lib\Expr\Updates.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="Passes\ClassifyingAliasAnalysisPass.cpp" />
<ClCompile Include="Passes\compilercore_assert.cpp" />
<ClCompile Include="Passes\ConstantConcretizationPass.cpp" />
<ClCompile Include="Passes\ControlledNodeSplittingPass.cpp" />
<ClCompile Include="Passes\generator_jit_ast_compute.cpp" />
<ClCompile Include="souper\lib\Codegen\Codegen.cpp" />
<ClCompile Include="souper\lib\Codegen\MachineCost.cpp" />
<ClCompile Include="souper\lib\Extractor\Candidates.cpp" />
<ClCompile Include="souper\lib\Extractor\ExprBuilder.cpp" />
<ClCompile Include="souper\lib\Extractor\KLEEBuilder.cpp" />
<ClCompile Include="souper\lib\Extractor\Solver.cpp" />
<ClCompile Include="souper\lib\Infer\AbstractInterpreter.cpp" />
<ClCompile Include="souper\lib\Infer\AliveDriver.cpp" />
<ClCompile Include="souper\lib\Infer\ConstantSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\EnumerativeSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\InstSynthesis.cpp" />
<ClCompile Include="souper\lib\Infer\Interpreter.cpp" />
<ClCompile Include="souper\lib\Infer\Preconditions.cpp" />
<ClCompile Include="souper\lib\Infer\Pruning.cpp" />
<ClCompile Include="souper\lib\Infer\Verification.cpp" />
<ClCompile Include="souper\lib\Infer\Z3Driver.cpp" />
<ClCompile Include="souper\lib\Infer\Z3Expr.cpp" />
<ClCompile Include="souper\lib\Inst\Inst.cpp" />
<ClCompile Include="souper\lib\KVStore\KVStore.cpp" />
<ClCompile Include="souper\lib\Parser\Parser.cpp" />
<ClCompile Include="souper\lib\Pass\Pass.cpp" />
<ClCompile Include="souper\lib\SMTLIB2\smtlib_Solver.cpp" />
<ClCompile Include="souper\lib\Tool\CandidateMapUtils.cpp" />
</ItemGroup>
<ItemGroup>
<None Include="klee\include\klee\Config\config.h.in" />
<None Include="klee\LICENSE.TXT" />
<None Include="klee\README.txt" />
<None Include="souper\include\souper\KVStore\KVSocket.h.in" />
<None Include="souper\include\souper\Tool\GetSolver.h.in" />
<None Include="souper\LICENSE" />
<None Include="souper\README.txt" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -139,6 +139,42 @@
<ClInclude Include="API\LLVM\IR\Dominators.h">
<Filter>API\LLVM\IR</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Config\config.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Config\Version.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Constraints.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Expr.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Internal\Support\IntEvaluation.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\Solver.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\util\Bits.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\util\ExprPPrinter.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\util\ExprSMTLIBPrinter.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\util\PrintContext.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="klee\include\klee\util\Ref.h">
<Filter>klee</Filter>
</ClInclude>
<ClInclude Include="souper\include\klee\Config\config.h">
<Filter>souper</Filter>
</ClInclude>
<ClInclude Include="souper\include\souper\Util\LLVMUtils.h">
<Filter>souper</Filter>
</ClInclude>
@@ -196,6 +232,9 @@
<ClInclude Include="souper\include\souper\Extractor\ExprBuilder.h">
<Filter>souper</Filter>
</ClInclude>
<ClInclude Include="souper\include\souper\Extractor\Solver.h">
<Filter>souper</Filter>
</ClInclude>
<ClInclude Include="souper\include\souper\Codegen\Codegen.h">
<Filter>souper</Filter>
</ClInclude>
@@ -322,16 +361,16 @@
<ClCompile Include="souper\lib\Codegen\MachineCost.cpp">
<Filter>souper</Filter>
</ClCompile>
<ClCompile Include="..\..\..\klee\lib\Expr\Expr.cpp">
<ClCompile Include="klee\lib\Expr\Expr.cpp">
<Filter>klee</Filter>
</ClCompile>
<ClCompile Include="..\..\..\klee\lib\Expr\ExprPPrinter.cpp">
<ClCompile Include="klee\lib\Expr\ExprPPrinter.cpp">
<Filter>klee</Filter>
</ClCompile>
<ClCompile Include="..\..\..\klee\lib\Expr\ExprSMTLIBPrinter.cpp">
<ClCompile Include="klee\lib\Expr\ExprSMTLIBPrinter.cpp">
<Filter>klee</Filter>
</ClCompile>
<ClCompile Include="..\..\..\klee\lib\Expr\Updates.cpp">
<ClCompile Include="klee\lib\Expr\Updates.cpp">
<Filter>klee</Filter>
</ClCompile>
<ClCompile Include="souper\lib\Infer\Z3Driver.cpp">
@@ -410,11 +449,26 @@
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="klee\include\klee\Config\config.h.in">
<Filter>klee</Filter>
</None>
<None Include="klee\LICENSE.TXT">
<Filter>klee</Filter>
</None>
<None Include="klee\README.txt">
<Filter>klee</Filter>
</None>
<None Include="souper\include\souper\Tool\GetSolver.h.in">
<Filter>souper</Filter>
</None>
<None Include="souper\include\souper\KVStore\KVSocket.h.in">
<Filter>souper</Filter>
</None>
<None Include="souper\LICENSE">
<Filter>souper</Filter>
</None>
<None Include="souper\README.txt">
<Filter>souper</Filter>
</None>
</ItemGroup>
</Project>
@@ -4,7 +4,6 @@
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
@@ -4,7 +4,6 @@
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
+1 -3
View File
@@ -1,9 +1,8 @@
#pragma once
#include <llvm/IR/Module.h>
#include "llvm-c/Transforms/PassManagerBuilder.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Triple.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
#include "llvm/Analysis/GlobalsModRef.h"
@@ -24,7 +23,6 @@
#include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
#include "llvm/Transforms/IPO/FunctionAttrs.h"
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/Scalar.h"
+2
View File
@@ -0,0 +1,2 @@
build*/
install*/
@@ -0,0 +1,53 @@
# https://alexreinking.com/blog/how-to-use-cmake-without-the-agonizing-pain-part-1.html
cmake_minimum_required(VERSION 3.21)
# Default to a Release config. Required before project() because Windows defaults to Debug
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "")
if(CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "" FORCE)
endif()
project(dependencies)
option(USE_PRECOMPILED_LLVM "Do not compile LLVM as part of the superbuild, use a precompiled one instead" OFF)
option(USE_SANITIZERS "Use ASan and UBSan" OFF)
if(USE_PRECOMPILED_LLVM)
# NOTE: We only search in ./install because that's where VS expects them
find_package(LLVM CONFIG REQUIRED NO_DEFAULT_PATH
PATHS ${PROJECT_SOURCE_DIR}/install
)
message(STATUS "LLVM ${LLVM_PACKAGE_VERSION}: ${LLVM_DIR}")
endif()
if(USE_SANITIZERS)
list(APPEND CMAKE_C_FLAGS "-fsanitize=address,undefined")
list(APPEND CMAKE_CXX_FLAGS "-fsanitize=address,undefined")
endif()
include(superbuild.cmake)
simple_git(https://github.com/Z3Prover/z3 z3-4.16.0
"-DZ3_BUILD_LIBZ3_SHARED:STRING=OFF"
)
simple_git(https://github.com/gflags/gflags 52e94563eba1968783864942fedf6e87e3c611f4
)
simple_git(https://github.com/google/glog v0.7.1
"-DGFLAGS_USE_TARGET_NAMESPACE:STRING=ON"
"-DBUILD_TESTING:STRING=OFF"
)
simple_git(https://github.com/google/googletest v1.17.0
"-Dgtest_force_shared_crt:STRING=ON"
"-DGFLAGS_USE_TARGET_NAMESPACE:STRING=ON"
)
include(xed.cmake)
if(NOT USE_PRECOMPILED_LLVM)
include(llvm.cmake)
endif()
simple_submodule(remill
"-DREMILL_ENABLE_TESTING:STRING=OFF"
)
+49
View File
@@ -0,0 +1,49 @@
# Dna.LLVMInterop native dependency superbuild
This folder is for CMake superbuild scripts that build/install the external
native dependencies consumed directly by Dna.LLVMInterop.dll, such as LLVM,
Remill, Z3, XED, gflags, glog, and sleigh libraries.
The intended generated prefix is:
```
Dna.LLVMInterop/dependencies/install
```
Dna.LLVMInterop.vcxproj expects headers and libraries at:
```
$(ProjectDir)dependencies\install\include
$(ProjectDir)dependencies\install\lib
```
Generated build/install/download folders are gitignored. Commit only the
superbuild scripts, patches, lock/version notes, and documentation needed to
reproduce the dependency prefix.
This setup is based on [LLVMParty/packages](https://github.com/LLVMParty/packages).
## Building
From a Visual Studio x64 command prompt:
```bash
cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
cmake --build build
```
Or if you have a precompiled LLVM, you need to copy it into the `install` folder to get this layout:
```
install/bin/clang.exe
install/include/llvm/IR/Value.h
install/lib/LLVMPasses.lib
install/lib/cmake/llvm/LLVMConfig.cmake
```
Then configure:
```bash
cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DUSE_PRECOMPILED_LLVM=ON
cmake --build build
```
@@ -0,0 +1,25 @@
# Reference: https://github.com/lifting-bits/cxx-common/blob/e0063b2f5986582ed8dcab0c2863abf0893b3082/ports/xed/XEDConfig.cmake
if(XED_FOUND)
return()
endif()
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
find_library(XED_LIBRARY xed PATHS "${PACKAGE_PREFIX_DIR}/lib" NO_CACHE REQUIRED NO_DEFAULT_PATH)
add_library(XED::XED STATIC IMPORTED)
set_target_properties(XED::XED PROPERTIES
IMPORTED_CONFIGURATIONS "NOCONFIG"
IMPORTED_LOCATION_NOCONFIG "${XED_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/include"
)
find_library(ILD_LIBRARY xed-ild PATHS "${PACKAGE_PREFIX_DIR}/lib" NO_CACHE REQUIRED NO_DEFAULT_PATH)
add_library(XED::ILD STATIC IMPORTED)
set_target_properties(XED::ILD PROPERTIES
IMPORTED_CONFIGURATIONS "NOCONFIG"
IMPORTED_LOCATION_NOCONFIG "${XED_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/include"
)
set(XED_FOUND ON)
+63
View File
@@ -0,0 +1,63 @@
option(LLVM_ENABLE_ASSERTIONS "Enable assertions in LLVM" ON)
# Default values for LLVM_URL and LLVM_SHA256. This is required because "-DLLVM_URL=" would be an empty URL
if("${LLVM_URL}" STREQUAL "")
set(LLVM_URL "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/llvm-project-17.0.6.src.tar.xz")
endif()
if("${LLVM_SHA256}" STREQUAL "")
set(LLVM_SHA256 "58a8818c60e6627064f312dbf46c02d9949956558340938b71cf731ad8bc0813")
endif()
set(LLVM_ARGS
"-DLLVM_ENABLE_PROJECTS:STRING=lld;clang;clang-tools-extra"
"-DLLVM_ENABLE_ASSERTIONS:STRING=${LLVM_ENABLE_ASSERTIONS}"
"-DLLVM_ENABLE_DUMP:STRING=${LLVM_ENABLE_ASSERTIONS}"
"-DLLVM_ENABLE_RTTI:STRING=ON"
"-DLLVM_ENABLE_LIBEDIT:STRING=OFF"
"-DLLVM_PARALLEL_LINK_JOBS:STRING=1"
"-DLLVM_ENABLE_DIA_SDK:STRING=OFF"
# This is meant for LLVM development, we use the DYLIB option instead
"-DBUILD_SHARED_LIBS:STRING=OFF"
"-DLLVM_LINK_LLVM_DYLIB:STRING=${BUILD_SHARED_LIBS}"
)
# LLVM has a bug on Windows where using clang.exe as the compiler fails to detect
# the host target triple, so we have to specify it manually.
# Reference: https://github.com/lifting-bits/remill/issues/735#issuecomment-3590986077
if(WIN32)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC$")
message(WARNING
"Using clang.exe as the compiler on Windows is not well supported.\n"
"If you run into issues, use clang-cl instead:\n"
" cmake -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl ...\n"
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
set(LLVM_ARCH "aarch64")
else()
set(LLVM_ARCH "x86_64")
endif()
else()
set(LLVM_ARCH "i686")
endif()
list(APPEND LLVM_ARGS "-DLLVM_HOST_TRIPLE:STRING=${LLVM_ARCH}-pc-windows-msvc")
endif()
endif()
if(USE_SANITIZERS)
list(APPEND LLVM_ARGS "-DLLVM_USE_SANITIZER:STRING=Address;Undefined")
endif()
ExternalProject_Add(llvm
URL
${LLVM_URL}
URL_HASH
"SHA256=${LLVM_SHA256}"
CMAKE_CACHE_ARGS
${CMAKE_ARGS}
${LLVM_ARGS}
CMAKE_GENERATOR
"Ninja"
SOURCE_SUBDIR
"llvm"
)
@@ -0,0 +1,204 @@
include_guard()
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
# Bail out early for multi-config generators
if(CMAKE_CONFIGURATION_TYPES)
message(FATAL_ERROR "Multi-config generators are not supported. Use Make/NMake/Ninja instead")
endif()
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(FATAL_ERROR "In-tree builds are not supported. Run CMake from a separate directory: cmake -B build")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "")
message(FATAL_ERROR "CMAKE_BUILD_TYPE is not set")
endif()
message(STATUS "Configuration: ${CMAKE_BUILD_TYPE}")
# Default to build/install (setting this variable is not recommended and might cause conflicts)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/../install" CACHE PATH "Install prefix" FORCE)
endif()
cmake_path(ABSOLUTE_PATH CMAKE_INSTALL_PREFIX NORMALIZE)
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Install prefix" FORCE)
message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
# Verify build configuration hasn't changed
set(BUILD_CONFIG_FILE "${CMAKE_INSTALL_PREFIX}/.build_config")
string(JOIN "\n" CURRENT_BUILD_CONFIG
"CMAKE_SYSTEM=${CMAKE_SYSTEM}"
"CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}"
"CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}"
"CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
)
if(EXISTS "${BUILD_CONFIG_FILE}")
file(READ "${BUILD_CONFIG_FILE}" PREVIOUS_BUILD_CONFIG)
if(NOT PREVIOUS_BUILD_CONFIG STREQUAL CURRENT_BUILD_CONFIG)
message(FATAL_ERROR
"Build configuration changed!\n"
"[previous]\n${PREVIOUS_BUILD_CONFIG}\n"
"[current]\n${CURRENT_BUILD_CONFIG}\n"
"\n"
"Please delete the build and install directories, then reconfigure:\n"
" cmake -E rm -rf \"${CMAKE_BINARY_DIR}\"\n"
" cmake -E rm -rf \"${CMAKE_INSTALL_PREFIX}\"\n"
)
endif()
else()
file(MAKE_DIRECTORY "${CMAKE_INSTALL_PREFIX}")
file(WRITE "${BUILD_CONFIG_FILE}" "${CURRENT_BUILD_CONFIG}")
endif()
# Git is necessary for submodules
find_package(Git REQUIRED)
message(STATUS "Git: ${GIT_EXECUTABLE}")
# Ninja is necessary for building the dependencies
find_program(ninja_EXECUTABLE ninja NO_CACHE NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH)
if(ninja_EXECUTABLE STREQUAL "ninja_EXECUTABLE-NOTFOUND")
message(FATAL_ERROR "Could not find 'ninja' in the PATH")
endif()
message(STATUS "Ninja: ${ninja_EXECUTABLE}")
# Documentation: https://cmake.org/cmake/help/latest/module/ExternalProject.html
include(ExternalProject)
# Hook for ExternalProject_Add to make sure projects build in order
function(ExternalProject_Add name)
# The DEPENDS argument is fully implicit
cmake_parse_arguments(HOOK "" "" DEPENDS ${ARGN})
if(HOOK_DEPENDS)
message(FATAL_ERROR "Explicit DEPENDS (${HOOK_DEPENDS}) not supported")
endif()
# Update the LAST_EXTERNAL_PROJECT property
get_property(LAST_EXTERNAL_PROJECT GLOBAL PROPERTY LAST_EXTERNAL_PROJECT)
set_property(GLOBAL PROPERTY LAST_EXTERNAL_PROJECT ${name})
# Pass the previous project as a dependency to this call
if(LAST_EXTERNAL_PROJECT)
set(HOOK_ARGS DEPENDS "${LAST_EXTERNAL_PROJECT}")
message(STATUS "ExternalProject: ${name} depends on ${LAST_EXTERNAL_PROJECT}")
else()
message(STATUS "ExternalProject: ${name}")
endif()
_ExternalProject_Add(${name} ${ARGN} ${HOOK_ARGS}
# Reference: https://www.scivision.dev/cmake-external-project-ninja-verbose/
USES_TERMINAL_DOWNLOAD ON
USES_TERMINAL_UPDATE ON
USES_TERMINAL_PATCH ON
USES_TERMINAL_CONFIGURE ON
USES_TERMINAL_BUILD ON
USES_TERMINAL_INSTALL ON
USES_TERMINAL_TEST ON
DOWNLOAD_EXTRACT_TIMESTAMP ON
)
endfunction()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
# Suppress warnings for clang-cl builds, some of these cause compilation errors.
list(APPEND ADDITIONAL_FLAGS "-w")
elseif(UNIX AND NOT APPLE)
# To compile shared libraries, everything needs to be compiled as position independent code when using clang on linux
list(APPEND ADDITIONAL_FLAGS "-fPIC")
endif()
endif()
# Convert a CMake list to a space-separated list
list(JOIN ADDITIONAL_FLAGS " " ADDITIONAL_FLAGS)
# Default cache variables for all projects
list(APPEND CMAKE_ARGS
"-DCMAKE_PREFIX_PATH:PATH=${CMAKE_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}"
"-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}"
"-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
"-DBUILD_SHARED_LIBS:STRING=${BUILD_SHARED_LIBS}"
"-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}"
"-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}"
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} ${ADDITIONAL_FLAGS}"
"-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} ${ADDITIONAL_FLAGS}"
"-DCMAKE_POSITION_INDEPENDENT_CODE:STRING=ON"
"-DCMAKE_ERROR_DEPRECATED:STRING=OFF"
"-DCMAKE_ERROR_DEVELOPER_WARNINGS:STRING=OFF"
"-DCMAKE_POLICY_DEFAULT_CMP0091:STRING=NEW" # Needed to make sure gflags respects CMAKE_MSVC_RUNTIME_LIBRARY as their minimum CMake version is older than 3.15.
)
# Only propagate the MSVC runtime selection if the parent project explicitly set
# one. Passing an empty CMAKE_MSVC_RUNTIME_LIBRARY to external projects on
# Windows suppresses the CRT selection and breaks clang's compiler checks.
if(DEFINED CMAKE_MSVC_RUNTIME_LIBRARY
AND NOT CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "")
list(APPEND CMAKE_ARGS
"-DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY}"
)
endif()
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
list(APPEND CMAKE_ARGS
"-DCMAKE_POLICY_VERSION_MINIMUM:STRING=${CMAKE_MINIMUM_REQUIRED_VERSION}"
)
endif()
if(CMAKE_C_COMPILER_LAUNCHER)
list(APPEND CMAKE_ARGS "-DCMAKE_C_COMPILER_LAUNCHER:FILEPATH=${CMAKE_C_COMPILER_LAUNCHER}")
endif()
if(CMAKE_CXX_COMPILER_LAUNCHER)
list(APPEND CMAKE_ARGS "-DCMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=${CMAKE_CXX_COMPILER_LAUNCHER}")
endif()
message(STATUS "Compiling all dependencies with the following CMake arguments:")
foreach(CMAKE_ARG ${CMAKE_ARGS})
message("\t${CMAKE_ARG}")
endforeach()
function(simple_git repo tag)
get_filename_component(name "${repo}" NAME_WE)
ExternalProject_Add(${name}
GIT_REPOSITORY
"${repo}"
GIT_TAG
"${tag}"
GIT_PROGRESS
ON
CMAKE_CACHE_ARGS
${CMAKE_ARGS}
${ARGN}
CMAKE_GENERATOR
"Ninja"
)
endfunction()
function(simple_submodule folder)
set(folder_path "${CMAKE_CURRENT_SOURCE_DIR}/${folder}")
if(NOT EXISTS "${folder_path}" OR NOT EXISTS "${folder_path}/CMakeLists.txt")
message(STATUS "Submodule '${folder}' not initialized, running git...")
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE git_root
OUTPUT_STRIP_TRAILING_WHITESPACE
COMMAND_ERROR_IS_FATAL ANY
)
execute_process(
COMMAND "${GIT_EXECUTABLE}" submodule update --init
WORKING_DIRECTORY "${git_root}"
COMMAND_ERROR_IS_FATAL ANY
)
endif()
ExternalProject_Add(${folder}
SOURCE_DIR
"${folder_path}"
CMAKE_CACHE_ARGS
${CMAKE_ARGS}
${ARGN}
CMAKE_GENERATOR
"Ninja"
# Always trigger the build step (necessary because there is no download step)
BUILD_ALWAYS
ON
)
endfunction()
+119
View File
@@ -0,0 +1,119 @@
find_package(Python3 COMPONENTS Interpreter REQUIRED)
message(STATUS "Python3: ${Python3_EXECUTABLE}")
# Reference: https://github.com/lifting-bits/cxx-common/blob/e0063b2f5986582ed8dcab0c2863abf0893b3082/ports/xed/portfile.cmake
# TODO: pass compiler flags
if(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND MSVC)
set(compiler ms) #msvc or clang-cl
elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$")
set(compiler clang)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(compiler gnu)
else()
message(FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}")
endif()
set(MFILE_ARGS
"install"
"--install-dir=install"
"--cc=${CMAKE_C_COMPILER}"
"--cxx=${CMAKE_CXX_COMPILER}"
"--compiler=${compiler}"
)
# XED is built by mbuild, not CMake, so it does not honor
# CMAKE_MSVC_RUNTIME_LIBRARY. mbuild also ties "--static" to /MT by default.
# Dna.LLVMInterop and the CMake-built dependencies use the DLL CRT (/MD), so
# disable mbuild's implicit CRT flag and pass the matching MSVC runtime flag
# explicitly. Without this, xed.lib/xed-ild.lib embed /DEFAULTLIB:libcmt.lib
# and the Dna.LLVMInterop link emits LNK4098.
if(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND MSVC)
set(xed_msvc_runtime_flag "")
if(DEFINED CMAKE_MSVC_RUNTIME_LIBRARY AND NOT CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "")
if(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DebugDLL$")
set(xed_msvc_runtime_flag "/MDd")
elseif(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
set(xed_msvc_runtime_flag "/MD")
elseif(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug$")
set(xed_msvc_runtime_flag "/MTd")
else()
set(xed_msvc_runtime_flag "/MT")
endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(xed_msvc_runtime_flag "/MDd")
else()
set(xed_msvc_runtime_flag "/MD")
endif()
list(APPEND MFILE_ARGS
"--no-mscrt"
"--extra-ccflags=${xed_msvc_runtime_flag}"
"--extra-cxxflags=${xed_msvc_runtime_flag}"
)
endif()
if(CMAKE_OSX_SYSROOT)
list(APPEND MFILE_ARGS "--extra-ccflags=-isysroot ${CMAKE_OSX_SYSROOT}")
list(APPEND MFILE_ARGS "--extra-cxxflags=-isysroot ${CMAKE_OSX_SYSROOT}")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
list(APPEND MFILE_ARGS "--extra-ccflags=${ADDITIONAL_FLAGS}")
list(APPEND MFILE_ARGS "--extra-cxxflags=${ADDITIONAL_FLAGS}")
endif()
if(USE_SANITIZERS)
list(APPEND MFILE_ARGS "--extra-ccflags=-fsanitize=address,undefined")
list(APPEND MFILE_ARGS "--extra-cxxflags=-fsanitize=address,undefined")
endif()
if(BUILD_SHARED_LIBS)
list(APPEND MFILE_ARGS "--shared")
else()
list(APPEND MFILE_ARGS "--static")
endif()
if(CMAKE_AR)
list(APPEND MFILE_ARGS "--ar=${CMAKE_AR}")
endif()
ExternalProject_Add(mbuild
GIT_REPOSITORY
"https://github.com/intelxed/mbuild"
GIT_TAG
"v2024.11.04"
GIT_PROGRESS
ON
CONFIGURE_COMMAND
"${CMAKE_COMMAND}" -E true
BUILD_COMMAND
"${CMAKE_COMMAND}" -E true
INSTALL_COMMAND
"${CMAKE_COMMAND}" -E true
PREFIX
xed-prefix
)
ExternalProject_Add(xed
GIT_REPOSITORY
"https://github.com/intelxed/xed"
GIT_TAG
"v2025.06.08"
GIT_PROGRESS
ON
CMAKE_CACHE_ARGS
${CMAKE_ARGS}
CONFIGURE_COMMAND
"${CMAKE_COMMAND}" -E true
BUILD_COMMAND
"${Python3_EXECUTABLE}" "<SOURCE_DIR>/mfile.py" ${MFILE_ARGS}
INSTALL_COMMAND
"${CMAKE_COMMAND}" -E copy_directory <BINARY_DIR>/install "${CMAKE_INSTALL_PREFIX}"
PREFIX
xed-prefix
)
# TODO: generate XEDVersion.cmake as well file
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/XEDConfig.cmake.in" "${CMAKE_INSTALL_PREFIX}/lib/cmake/XED/XEDConfig.cmake" @ONLY)
+62
View File
@@ -0,0 +1,62 @@
==============================================================================
klee Release License
==============================================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2007-2009 Stanford University.
All rights reserved.
Developed by:
klee Team
Stanford Checking Group
http://klee.llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
* Neither the names of the klee Team, Stanford University, nor the
names of its contributors may be used to endorse or promote
products derived from this Software without specific prior
written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
==============================================================================
The klee software contains code written by third parties. Such software will
have its own individual LICENSE.TXT file in the directory in which it appears.
This file will describe the copyrights, license, and restrictions which apply
to that code.
The disclaimer of warranty in the University of Illinois Open Source License
applies to all code in the klee Distribution, and nothing in any of the other
licenses gives permission to use the names of the klee Team or Stanford
University to endorse or promote products derived from this Software.
The following pieces of software have additional or alternate copyrights,
licenses, and/or restrictions:
Program Directory
------- ---------
klee-libc runtime/klee-libc
+35
View File
@@ -0,0 +1,35 @@
Dna.LLVMInterop KLEE vendor notes
=================================
This directory is a limited, checked-in vendor copy of KLEE source used by the
vendored Souper KLEE expression/SMTLIB backend. It is intentionally not a git
submodule and it is not a full KLEE checkout.
Likely upstream base
--------------------
The local source used for this vendor refresh was:
repository: https://github.com/Colton1skees/klee
branch: klee-for-souper-13
commit: 63a8acc1bf8d113aed72560708a505ae569b91fe
("make klee compile on windows")
Vendored subset
---------------
Keep the upstream KLEE directory layout for the subset we vendor:
include/klee/...
lib/Expr/...
Dna currently vendors the KLEE headers and Expr implementation files needed by
Souper's KLEEBuilder/SMTLIB printer. Dna.LLVMInterop compiles these sources
directly into Dna.LLVMInterop.dll rather than linking a separate KLEE library.
The upstream KLEE tree generates include/klee/Config/config.h from
config.h.in. Because this is a partial checked-in vendor copy, Dna also checks
in a generated config.h configured for the LLVM 17 build used by this project.
When refreshing KLEE, copy only the needed files while preserving their upstream
relative paths, then reapply any Dna build/configuration adjustments.
@@ -0,0 +1,13 @@
// Generated vendored KLEE configuration for Dna.LLVMInterop.
//
// The upstream KLEE source keeps this file generated from config.h.in. Dna
// vendors only the small Expr/SMTLIB subset needed by Souper, so the generated
// configuration is checked in with the vendored files.
#ifndef KLEE_CONFIG_CONFIG_H
#define KLEE_CONFIG_CONFIG_H
#define LLVM_VERSION_MAJOR 17
#define LLVM_VERSION_MINOR 0
#endif
@@ -0,0 +1,79 @@
//===-- Constraints.h -------------------------------------------*- C++ -*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_CONSTRAINTS_H
#define KLEE_CONSTRAINTS_H
#include "klee/Expr.h"
// FIXME: Currently we use ConstraintManager for two things: to pass
// sets of constraints around, and to optimize constraints. We should
// move the first usage into a separate data structure
// (ConstraintSet?) which ConstraintManager could embed if it likes.
namespace klee {
class ExprVisitor;
class ConstraintManager {
public:
typedef std::vector< ref<Expr> > constraints_ty;
typedef constraints_ty::iterator iterator;
typedef constraints_ty::const_iterator const_iterator;
ConstraintManager() {}
// create from constraints with no optimization
explicit
ConstraintManager(const std::vector< ref<Expr> > &_constraints) :
constraints(_constraints) {}
ConstraintManager(const ConstraintManager &cs) : constraints(cs.constraints) {}
typedef std::vector< ref<Expr> >::const_iterator constraint_iterator;
// given a constraint which is known to be valid, attempt to
// simplify the existing constraint set
void simplifyForValidConstraint(ref<Expr> e);
ref<Expr> simplifyExpr(ref<Expr> e) const;
void addConstraint(ref<Expr> e);
bool empty() const {
return constraints.empty();
}
ref<Expr> back() const {
return constraints.back();
}
constraint_iterator begin() const {
return constraints.begin();
}
constraint_iterator end() const {
return constraints.end();
}
size_t size() const {
return constraints.size();
}
bool operator==(const ConstraintManager &other) const {
return constraints == other.constraints;
}
private:
std::vector< ref<Expr> > constraints;
// returns true iff the constraints were modified
bool rewriteConstraints(ExprVisitor &visitor);
void addConstraintInternal(ref<Expr> e);
};
}
#endif /* KLEE_CONSTRAINTS_H */
+1 -1
View File
@@ -439,7 +439,7 @@ public:
}
/// isAllOnes - Is this constant all ones.
bool isAllOnes() const { return getAPValue().isAllOnesValue(); }
bool isAllOnes() const { return getAPValue().isAllOnes(); }
/* Constant Operations */
@@ -0,0 +1,164 @@
//===-- IntEvaluation.h -----------------------------------------*- C++ -*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_UTIL_INTEVALUATION_H
#define KLEE_UTIL_INTEVALUATION_H
#include "klee/util/Bits.h"
#define MAX_BITS (sizeof(uint64_t) * 8)
// ASSUMPTION: invalid bits in each uint64_t are 0. the trade-off here is
// between making trunc/zext/sext fast and making operations that depend
// on the invalid bits being 0 fast.
namespace klee {
namespace ints {
// add of l and r
inline uint64_t add(uint64_t l, uint64_t r, unsigned inWidth) {
return bits64::truncateToNBits(l + r, inWidth);
}
// difference of l and r
inline uint64_t sub(uint64_t l, uint64_t r, unsigned inWidth) {
return bits64::truncateToNBits(l - r, inWidth);
}
// product of l and r
inline uint64_t mul(uint64_t l, uint64_t r, unsigned inWidth) {
return bits64::truncateToNBits(l * r, inWidth);
}
// truncation of l to outWidth bits
inline uint64_t trunc(uint64_t l, unsigned outWidth, unsigned inWidth) {
return bits64::truncateToNBits(l, outWidth);
}
// zero-extension of l from inWidth to outWidth bits
inline uint64_t zext(uint64_t l, unsigned outWidth, unsigned inWidth) {
return l;
}
// sign-extension of l from inWidth to outWidth bits
inline uint64_t sext(uint64_t l, unsigned outWidth, unsigned inWidth) {
uint32_t numInvalidBits = MAX_BITS - inWidth;
return bits64::truncateToNBits(((int64_t)(l << numInvalidBits)) >> numInvalidBits, outWidth);
}
// unsigned divide of l by r
inline uint64_t udiv(uint64_t l, uint64_t r, unsigned inWidth) {
return bits64::truncateToNBits(l / r, inWidth);
}
// unsigned mod of l by r
inline uint64_t urem(uint64_t l, uint64_t r, unsigned inWidth) {
return bits64::truncateToNBits(l % r, inWidth);
}
// signed divide of l by r
inline uint64_t sdiv(uint64_t l, uint64_t r, unsigned inWidth) {
// sign extend operands so that signed operation on 64-bits works correctly
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return bits64::truncateToNBits(sl / sr, inWidth);
}
// signed mod of l by r
inline uint64_t srem(uint64_t l, uint64_t r, unsigned inWidth) {
// sign extend operands so that signed operation on 64-bits works correctly
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return bits64::truncateToNBits(sl % sr, inWidth);
}
// arithmetic shift right of l by r bits
inline uint64_t ashr(uint64_t l, uint64_t shift, unsigned inWidth) {
int64_t sl = sext(l, MAX_BITS, inWidth);
return bits64::truncateToNBits(sl >> shift, inWidth);
}
// logical shift right of l by r bits
inline uint64_t lshr(uint64_t l, uint64_t shift, unsigned inWidth) {
return l >> shift;
}
// shift left of l by r bits
inline uint64_t shl(uint64_t l, uint64_t shift, unsigned inWidth) {
return bits64::truncateToNBits(l << shift, inWidth);
}
// logical AND of l and r
inline uint64_t land(uint64_t l, uint64_t r, unsigned inWidth) {
return l & r;
}
// logical OR of l and r
inline uint64_t lor(uint64_t l, uint64_t r, unsigned inWidth) {
return l | r;
}
// logical XOR of l and r
inline uint64_t lxor(uint64_t l, uint64_t r, unsigned inWidth) {
return l ^ r;
}
// comparison operations
inline uint64_t eq(uint64_t l, uint64_t r, unsigned inWidth) {
return l == r;
}
inline uint64_t ne(uint64_t l, uint64_t r, unsigned inWidth) {
return l != r;
}
inline uint64_t ult(uint64_t l, uint64_t r, unsigned inWidth) {
return l < r;
}
inline uint64_t ule(uint64_t l, uint64_t r, unsigned inWidth) {
return l <= r;
}
inline uint64_t ugt(uint64_t l, uint64_t r, unsigned inWidth) {
return l > r;
}
inline uint64_t uge(uint64_t l, uint64_t r, unsigned inWidth) {
return l >= r;
}
inline uint64_t slt(uint64_t l, uint64_t r, unsigned inWidth) {
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return sl < sr;
}
inline uint64_t sle(uint64_t l, uint64_t r, unsigned inWidth) {
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return sl <= sr;
}
inline uint64_t sgt(uint64_t l, uint64_t r, unsigned inWidth) {
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return sl > sr;
}
inline uint64_t sge(uint64_t l, uint64_t r, unsigned inWidth) {
int64_t sl = sext(l, MAX_BITS, inWidth);
int64_t sr = sext(r, MAX_BITS, inWidth);
return sl >= sr;
}
} // end namespace ints
} // end namespace klee
#endif
+293
View File
@@ -0,0 +1,293 @@
//===-- Solver.h ------------------------------------------------*- C++ -*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_SOLVER_H
#define KLEE_SOLVER_H
#include "klee/Expr.h"
#include <vector>
namespace klee {
class ConstraintManager;
class Expr;
class SolverImpl;
struct Query {
public:
const ConstraintManager &constraints;
ref<Expr> expr;
Query(const ConstraintManager& _constraints, ref<Expr> _expr)
: constraints(_constraints), expr(_expr) {
}
/// withExpr - Return a copy of the query with the given expression.
Query withExpr(ref<Expr> _expr) const {
return Query(constraints, _expr);
}
/// withFalse - Return a copy of the query with a false expression.
Query withFalse() const {
return Query(constraints, ConstantExpr::alloc(0, Expr::Bool));
}
/// negateExpr - Return a copy of the query with the expression negated.
Query negateExpr() const {
return withExpr(Expr::createIsZero(expr));
}
};
class Solver {
// DO NOT IMPLEMENT.
Solver(const Solver&);
void operator=(const Solver&);
public:
enum Validity {
True = 1,
False = -1,
Unknown = 0
};
public:
/// validity_to_str - Return the name of given Validity enum value.
static const char *validity_to_str(Validity v);
public:
SolverImpl *impl;
public:
Solver(SolverImpl *_impl) : impl(_impl) {}
virtual ~Solver();
/// evaluate - Determine for a particular state if the query
/// expression is provably true, provably false or neither.
///
/// \param [out] result - if
/// \f[ \forall X constraints(X) \to query(X) \f]
/// then Solver::True,
/// else if
/// \f[ \forall X constraints(X) \to \lnot query(X) \f]
/// then Solver::False,
/// else
/// Solver::Unknown
///
/// \return True on success.
bool evaluate(const Query&, Validity &result);
/// mustBeTrue - Determine if the expression is provably true.
///
/// This evaluates the following logical formula:
///
/// \f[ \forall X constraints(X) \to query(X) \f]
///
/// which is equivalent to
///
/// \f[ \lnot \exists X constraints(X) \land \lnot query(X) \f]
///
/// Where \f$X\f$ is some assignment, \f$constraints(X)\f$ are the constraints
/// in the query and \f$query(X)\f$ is the query expression.
///
/// \param [out] result - On success, true iff the logical formula is true
///
/// \return True on success.
bool mustBeTrue(const Query&, bool &result);
/// mustBeFalse - Determine if the expression is provably false.
///
/// This evaluates the following logical formula:
///
/// \f[ \lnot \exists X constraints(X) \land query(X) \f]
///
/// which is equivalent to
///
/// \f[ \forall X constraints(X) \to \lnot query(X) \f]
///
/// Where \f$X\f$ is some assignment, \f$constraints(X)\f$ are the constraints
/// in the query and \f$query(X)\f$ is the query expression.
///
/// \param [out] result - On success, true iff the logical formula is false
///
/// \return True on success.
bool mustBeFalse(const Query&, bool &result);
/// mayBeTrue - Determine if there is a valid assignment for the given state
/// in which the expression evaluates to true.
///
/// This evaluates the following logical formula:
///
/// \f[ \exists X constraints(X) \land query(X) \f]
///
/// which is equivalent to
///
/// \f[ \lnot \forall X constraints(X) \to \lnot query(X) \f]
///
/// Where \f$X\f$ is some assignment, \f$constraints(X)\f$ are the constraints
/// in the query and \f$query(X)\f$ is the query expression.
///
/// \param [out] result - On success, true iff the logical formula may be true
///
/// \return True on success.
bool mayBeTrue(const Query&, bool &result);
/// mayBeFalse - Determine if there is a valid assignment for the given
/// state in which the expression evaluates to false.
///
/// This evaluates the following logical formula:
///
/// \f[ \exists X constraints(X) \land \lnot query(X) \f]
///
/// which is equivalent to
///
/// \f[ \lnot \forall X constraints(X) \to query(X) \f]
///
/// Where \f$X\f$ is some assignment, \f$constraints(X)\f$ are the constraints
/// in the query and \f$query(X)\f$ is the query expression.
///
/// \param [out] result - On success, true iff the logical formula may be false
///
/// \return True on success.
bool mayBeFalse(const Query&, bool &result);
/// getValue - Compute one possible value for the given expression.
///
/// \param [out] result - On success, a value for the expression in some
/// satisfying assignment.
///
/// \return True on success.
bool getValue(const Query&, ref<ConstantExpr> &result);
/// getInitialValues - Compute the initial values for a list of objects.
///
/// \param [out] result - On success, this vector will be filled in with an
/// array of bytes for each given object (with length matching the object
/// size). The bytes correspond to the initial values for the objects for
/// some satisfying assignment.
///
/// \return True on success.
///
/// NOTE: This function returns failure if there is no satisfying
/// assignment.
//
// FIXME: This API is lame. We should probably just provide an API which
// returns an Assignment object, then clients can get out whatever values
// they want. This also allows us to optimize the representation.
bool getInitialValues(const Query&,
const std::vector<const Array*> &objects,
std::vector< std::vector<unsigned char> > &result);
/// getRange - Compute a tight range of possible values for a given
/// expression.
///
/// \return - A pair with (min, max) values for the expression.
///
/// \post(mustBeTrue(min <= e <= max) &&
/// mayBeTrue(min == e) &&
/// mayBeTrue(max == e))
//
// FIXME: This should go into a helper class, and should handle failure.
virtual std::pair< ref<Expr>, ref<Expr> > getRange(const Query&);
virtual char *getConstraintLog(const Query& query);
virtual void setCoreSolverTimeout(double timeout);
};
/// STPSolver - A complete solver based on STP.
class STPSolver : public Solver {
public:
/// STPSolver - Construct a new STPSolver.
///
/// \param useForkedSTP - Whether STP should be run in a separate process
/// (required for using timeouts).
/// \param optimizeDivides - Whether constant division operations should
/// be optimized into add/shift/multiply operations.
STPSolver(bool useForkedSTP, bool optimizeDivides = true);
/// getConstraintLog - Return the constraint log for the given state in CVC
/// format.
virtual char *getConstraintLog(const Query&);
/// setCoreSolverTimeout - Set constraint solver timeout delay to the given value; 0
/// is off.
virtual void setCoreSolverTimeout(double timeout);
};
#ifdef SUPPORT_METASMT
template<typename SolverContext>
class MetaSMTSolver : public Solver {
public:
MetaSMTSolver(bool useForked, bool optimizeDivides);
virtual ~MetaSMTSolver();
virtual char *getConstraintLog(const Query&);
virtual void setCoreSolverTimeout(double timeout);
};
#endif /* SUPPORT_METASMT */
/* *** */
/// createValidatingSolver - Create a solver which will validate all query
/// results against an oracle, used for testing that an optimized solver has
/// the same results as an unoptimized one. This solver will assert on any
/// mismatches.
///
/// \param s - The primary underlying solver to use.
/// \param oracle - The solver to check query results against.
Solver *createValidatingSolver(Solver *s, Solver *oracle);
/// createCachingSolver - Create a solver which will cache the queries in
/// memory (without eviction).
///
/// \param s - The underlying solver to use.
Solver *createCachingSolver(Solver *s);
/// createCexCachingSolver - Create a counterexample caching solver. This is a
/// more sophisticated cache which records counterexamples for a constraint
/// set and uses subset/superset relations among constraints to try and
/// quickly find satisfying assignments.
///
/// \param s - The underlying solver to use.
Solver *createCexCachingSolver(Solver *s);
/// createFastCexSolver - Create a "fast counterexample solver", which tries
/// to quickly compute a satisfying assignment for a constraint set using
/// value propogation and range analysis.
///
/// \param s - The underlying solver to use.
Solver *createFastCexSolver(Solver *s);
/// createIndependentSolver - Create a solver which will eliminate any
/// unnecessary constraints before propogating the query to the underlying
/// solver.
///
/// \param s - The underlying solver to use.
Solver *createIndependentSolver(Solver *s);
/// createPCLoggingSolver - Create a solver which will forward all queries
/// after writing them to the given path in .pc format.
Solver *createPCLoggingSolver(Solver *s, std::string path,
int minQueryTimeToLog);
/// createSMTLIBLoggingSolver - Create a solver which will forward all queries
/// after writing them to the given path in .smt2 format.
Solver *createSMTLIBLoggingSolver(Solver *s, std::string path,
int minQueryTimeToLog);
/// createDummySolver - Create a dummy solver implementation which always
/// fails.
Solver *createDummySolver();
}
#endif
@@ -0,0 +1,389 @@
//===-- ExprSMTLIBPrinter.h ------------------------------------------*- C++
//-*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_EXPRSMTLIBPRINTER_H
#define KLEE_EXPRSMTLIBPRINTER_H
#include <string>
#include <set>
#include <map>
#include <klee/Constraints.h>
#include <klee/Expr.h>
#include <klee/util/PrintContext.h>
#include <klee/Solver.h>
namespace llvm {
class raw_ostream;
}
namespace klee {
/// Base Class for SMTLIBv2 printer for KLEE Queries. It uses the QF_ABV logic.
/// Note however the logic can be
/// set to QF_AUFBV because some solvers (e.g. STP) complain if this logic is
/// set to QF_ABV.
///
/// This printer abbreviates expressions according to its abbreviation mode.
///
/// It is intended to be used as follows
/// -# Create instance of this class
/// -# Set output ( setOutput() )
/// -# Set query to print ( setQuery() )
/// -# Set options using the methods prefixed with the word "set".
/// -# Call generateOutput()
///
/// The class can then be used again on another query ( setQuery() ).
/// The options set are persistent across queries (apart from
/// setArrayValuesToGet() and PRODUCE_MODELS).
///
///
/// Note that in KLEE at the lowest level the solver checks for validity of the
/// query, i.e.
///
/// \f[ \forall X constraints(X) \to query(X) \f]
///
/// Where \f$X\f$ is some assignment, \f$constraints(X)\f$ are the constraints
/// in the query and \f$query(X)\f$ is the query expression.
/// If the above formula is true the query is said to be **valid**, otherwise it
/// is
/// **invalid**.
///
/// The SMTLIBv2 language works in terms of satisfiability rather than validity
/// so instead
/// this class must ask the equivalent query but in terms of satisfiability
/// which is:
///
/// \f[ \lnot \exists X constraints(X) \land \lnot query(X) \f]
///
/// The printed SMTLIBv2 query actually asks the following:
///
/// \f[ \exists X constraints(X) \land \lnot query(X) \f]
/// Hence the printed SMTLIBv2 query will just assert the constraints and the
/// negation
/// of the query expression.
///
/// If a SMTLIBv2 solver says the printed query is satisfiable the then original
/// query passed to this class was **invalid** and if a SMTLIBv2 solver says the
/// printed
/// query is unsatisfiable then the original query passed to this class was
/// **valid**.
///
class ExprSMTLIBPrinter {
public:
/// Different SMTLIBv2 logics supported by this class
/// \sa setLogic()
enum SMTLIBv2Logic {
QF_BV, ///< Logic using Theory of Bitvectors
QF_ABV, ///< Logic using Theory of Arrays and Theory of Bitvectors
QF_AUFBV ///< Logic using Theory of Arrays and Theory of Bitvectors and has
///< uninterpreted functions
};
/// Different SMTLIBv2 options that have a boolean value that can be set
/// \sa setSMTLIBboolOption
enum SMTLIBboolOptions {
PRINT_SUCCESS, ///< print-success SMTLIBv2 option
PRODUCE_MODELS, ///< produce-models SMTLIBv2 option
INTERACTIVE_MODE ///< interactive-mode SMTLIBv2 option
};
/// Different SMTLIBv2 bool option values
/// \sa setSMTLIBboolOption
enum SMTLIBboolValues {
OPTION_TRUE, ///< Set option to true
OPTION_FALSE, ///< Set option to false
OPTION_DEFAULT ///< Use solver's defaults (the option will not be set in
///< output)
};
enum ConstantDisplayMode {
BINARY, ///< Display bit vector constants in binary e.g. #b00101101
HEX, ///< Display bit vector constants in Hexidecimal e.g.#x2D
DECIMAL ///< Display bit vector constants in Decimal e.g. (_ bv45 8)
};
/// How to abbreviate repeatedly mentioned expressions. Some solvers do not
/// understand all of them, hence the flexibility.
enum AbbreviationMode {
ABBR_NONE, ///< Do not abbreviate.
ABBR_LET, ///< Abbreviate with let.
ABBR_NAMED ///< Abbreviate with :named annotations.
};
/// Different supported SMTLIBv2 sorts (a.k.a type) in QF_AUFBV
enum SMTLIB_SORT { SORT_BITVECTOR, SORT_BOOL };
/// Allows the way Constant bitvectors are printed to be changed.
/// This setting is persistent across queries.
/// \return true if setting the mode was successful
bool setConstantDisplayMode(ConstantDisplayMode cdm);
ConstantDisplayMode getConstantDisplayMode() { return cdm; }
void setAbbreviationMode(AbbreviationMode am) { abbrMode = am; }
/// Create a new printer that will print a query in the SMTLIBv2 language.
ExprSMTLIBPrinter();
/// Set the output stream that will be printed to.
/// This call is persistent across queries.
void setOutput(llvm::raw_ostream &output);
/// Set the query to print. This will setArrayValuesToGet()
/// to none (i.e. no array values will be requested using
/// the SMTLIBv2 (get-value ()) command).
void setQuery(const Query &q);
~ExprSMTLIBPrinter();
/// Print the query to the llvm::raw_ostream
/// setOutput() and setQuery() must be called before calling this.
///
/// All options should be set before calling this.
/// \sa setConstantDisplayMode
/// \sa setLogic()
/// \sa setHumanReadable
/// \sa setSMTLIBboolOption
/// \sa setArrayValuesToGet
///
/// Mostly it does not matter what order the options are set in. However
/// calling
/// setArrayValuesToGet() implies PRODUCE_MODELS is set so, if a call to
/// setSMTLIBboolOption()
/// is made that uses the PRODUCE_MODELS before calling setArrayValuesToGet()
/// then the setSMTLIBboolOption()
/// call will be ineffective.
void generateOutput();
/// Set which SMTLIBv2 logic to use.
/// This only affects what logic is used in the (set-logic <logic>) command.
/// The rest of the printed SMTLIBv2 commands are the same regardless of the
/// logic used.
///
/// \return true if setting logic was successful.
bool setLogic(SMTLIBv2Logic l);
/// Sets how readable the printed SMTLIBv2 commands are.
/// \param hr If set to true the printed commands are made more human
/// readable.
///
/// The printed commands are made human readable by...
/// - Indenting and line breaking.
/// - Adding comments
void setHumanReadable(bool hr);
/// Set SMTLIB options.
/// These options will be printed when generateOutput() is called via
/// the SMTLIBv2 command (set-option :option-name <value>)
///
/// By default no options will be printed so the SMTLIBv2 solver will use
/// its default values for all options.
///
/// \return true if option was successfully set.
///
/// The options set are persistent across calls to setQuery() apart from the
/// PRODUCE_MODELS option which this printer may automatically set/unset.
bool setSMTLIBboolOption(SMTLIBboolOptions option, SMTLIBboolValues value);
/// Set the array names that the SMTLIBv2 solver will be asked to determine.
/// Calling this method implies the PRODUCE_MODELS option is true and will
/// change
/// any previously set value.
///
/// If no call is made to this function before
/// ExprSMTLIBPrinter::generateOutput() then
/// the solver will only be asked to check satisfiability.
///
/// If the passed vector is not empty then the values of those arrays will be
/// requested
/// via (get-value ()) SMTLIBv2 command in the output stream in the same order
/// as vector.
void setArrayValuesToGet(const std::vector<const Array *> &a);
/// \return True if human readable mode is switched on
bool isHumanReadable();
protected:
/// Contains the arrays found during scans
std::set<const Array *> usedArrays;
/// Set of expressions seen during scan.
std::set<ref<Expr> > seenExprs;
typedef std::map<const ref<Expr>, int> BindingMap;
/// Let expression binding number map. Under the :named abbreviation mode,
/// negative binding numbers indicate that the abbreviation has already been
/// emitted, so it may be used.
BindingMap bindings;
/// An ordered list of expression bindings.
/// Exprs in BindingMap at index i depend on Exprs in BindingMap at i-1.
/// Exprs in orderedBindings[0] have no dependencies.
std::vector<BindingMap> orderedBindings;
/// Output stream to write to
llvm::raw_ostream *o;
/// The query to print
const Query *query;
/// Determine the SMTLIBv2 sort of the expression
SMTLIB_SORT getSort(const ref<Expr> &e);
/// Print an expression but cast it to a particular SMTLIBv2 sort first.
void printCastToSort(const ref<Expr> &e, ExprSMTLIBPrinter::SMTLIB_SORT sort);
// Resets various internal objects for a new query
void reset();
// Scan all constraints and the query
void scanAll();
// Print an initial SMTLIBv2 comment before anything else is printed
void printNotice();
// Print SMTLIBv2 options e.g. (set-option :option-name <value>) command
void printOptions();
// Print SMTLIBv2 logic to use e.g. (set-logic QF_ABV)
void printSetLogic();
// Print SMTLIBv2 bitvector declarations
void printBvDeclarations();
// Print SMTLIBv2 assertions for constant arrays
void printArrayDeclarations();
// Print SMTLIBv2 for the query optimised for human readability
void printHumanReadableQuery();
// Print SMTLIBv2 for the query optimised for minimal query size.
// This does not imply ABBR_LET or ABBR_NAMED (although it would be wise
// to use them to minimise the query size further)
void printMachineReadableQuery();
void printQueryInSingleAssert();
/// Print the SMTLIBv2 command to check satisfiability and also optionally
/// request for values
/// \sa setArrayValuesToGet()
void printAction();
/// Print the SMTLIBv2 command to exit
void printExit();
/// Print a Constant in the format specified by the current "Constant Display
/// Mode"
void printConstant(const ref<ConstantExpr> &e);
/// Recursively print expression
/// \param e is the expression to print
/// \param expectedSort is the sort we want. If "e" is not of the right type a
/// cast will be performed.
/// \param abbrMode the abbreviation mode to use for this expression
void printExpression(const ref<Expr> &e, SMTLIB_SORT expectedSort);
/// Scan Expression recursively for Arrays in expressions. Found arrays are
/// added to
/// the usedArrays vector.
void scan(const ref<Expr> &e);
/// Scan bindings for expression intra-dependencies. The result is written
/// to the orderedBindings vector that is later used for nested expression
/// printing in the let abbreviation mode.
void scanBindingExprDeps();
/* Rules of recursion for "Special Expression handlers" and
*printSortArgsExpr()
*
* 1. The parent of the recursion will have created an indent level for you so
*you don't need to add another initially.
* 2. You do not need to add a line break (via printSeperator() ) at the end,
*the parent caller will handle that.
* 3. The effect of a single recursive call should not affect the depth of the
*indent stack (nor the contents
* of the indent stack prior to the call). I.e. After executing a single
*recursive call the indent stack
* should have the same size and contents as before executing the recursive
*call.
*/
// Special Expression handlers
void printReadExpr(const ref<ReadExpr> &e);
void printExtractExpr(const ref<ExtractExpr> &e);
void printCastExpr(const ref<CastExpr> &e);
void printNotEqualExpr(const ref<NeExpr> &e);
void printSelectExpr(const ref<SelectExpr> &e,
ExprSMTLIBPrinter::SMTLIB_SORT s);
// For the set of operators that take sort "s" arguments
void printSortArgsExpr(const ref<Expr> &e,
ExprSMTLIBPrinter::SMTLIB_SORT s);
/// For the set of operators that come in two sorts (e.g. (and () ()) (bvand
/// () ()) )
/// These are and,xor,or,not
/// \param e the Expression to print
/// \param s the sort of the expression we want
void printLogicalOrBitVectorExpr(const ref<Expr> &e,
ExprSMTLIBPrinter::SMTLIB_SORT s);
/// Recursively prints updatesNodes
void printUpdatesAndArray(const UpdateNode *un, const Array *root);
/// This method does the translation between Expr classes and SMTLIBv2
/// keywords
/// \return A C-string of the SMTLIBv2 keyword
const char *getSMTLIBKeyword(const ref<Expr> &e);
void printSeperator();
/// Helper function for scan() that scans the expressions of an update node
void scanUpdates(const UpdateNode *un);
/// Helper printer class
PrintContext *p;
/// This contains the query from the solver but negated for our purposes.
/// \sa negateQueryExpression()
ref<Expr> queryAssert;
/// Indicates if there were any constant arrays founds during a scan()
bool haveConstantArray;
private:
SMTLIBv2Logic logicToUse;
volatile bool humanReadable;
// Map of enabled SMTLIB Options
std::map<SMTLIBboolOptions, bool> smtlibBoolOptions;
// Print a SMTLIBv2 option as a C-string
const char *
getSMTLIBOptionString(ExprSMTLIBPrinter::SMTLIBboolOptions option);
/// Print expression without top-level abbreviations
void printFullExpression(const ref<Expr> &e, SMTLIB_SORT expectedSort);
/// Print an assert statement for the given expr.
void printAssert(const ref<Expr> &e);
// Pointer to a vector of Arrays. These will be used for the (get-value () )
// call.
const std::vector<const Array *> *arraysToCallGetValueOn;
ConstantDisplayMode cdm;
AbbreviationMode abbrMode;
};
}
#endif
@@ -0,0 +1,91 @@
#ifndef PRINTCONTEXT_H_
#define PRINTCONTEXT_H_
#include "klee/Expr.h"
#include "llvm/Support/raw_ostream.h"
#include <sstream>
#include <string>
#include <stack>
/// PrintContext - Helper class for pretty printing.
/// It provides a basic wrapper around llvm::raw_ostream that keeps track of
/// how many characters have been used on the current line.
///
/// It also provides an optional way keeping track of the various levels of indentation
/// by using a stack.
/// \sa breakLineI() , \sa pushIndent(), \sa popIndent()
class PrintContext {
private:
llvm::raw_ostream &os;
std::string newline;
///This is used to keep track of the stack of indentations used by
/// \sa breakLineI()
/// \sa pushIndent()
/// \sa popIndent()
std::stack<unsigned int> indentStack;
public:
/// Number of characters on the current line.
unsigned pos;
PrintContext(llvm::raw_ostream &_os) : os(_os), newline("\n"), indentStack(), pos()
{
indentStack.push(pos);
}
void setNewline(const std::string &_newline) {
newline = _newline;
}
void breakLine(unsigned indent=0) {
os << newline;
if (indent)
os.indent(indent) << ' ';
pos = indent;
}
///Break line using the indent on the top of the indent stack
/// \return The PrintContext object so the method is chainable
PrintContext& breakLineI()
{
breakLine(indentStack.top());
return *this;
}
///Add the current position on the line to the top of the indent stack
/// \return The PrintContext object so the method is chainable
PrintContext& pushIndent()
{
indentStack.push(pos);
return *this;
}
///Pop the top off the indent stack
/// \return The PrintContext object so the method is chainable
PrintContext& popIndent()
{
indentStack.pop();
return *this;
}
/// write - Output a string to the stream and update the
/// position. The stream should not have any newlines.
void write(const std::string &s) {
os << s;
pos += s.length();
}
template <typename T>
PrintContext &operator<<(T elt) {
std::string str;
llvm::raw_string_ostream ss(str);
ss << elt;
write(ss.str());
return *this;
}
};
#endif /* PRINTCONTEXT_H_ */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,552 @@
//===-- ExprPPrinter.cpp - ----------------------------------------------===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "klee/util/PrintContext.h"
#include "klee/util/ExprPPrinter.h"
#include "klee/Constraints.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
#include <map>
#include <vector>
using namespace klee;
namespace {
llvm::cl::opt<bool>
PCWidthAsArg("pc-width-as-arg", llvm::cl::init(true));
llvm::cl::opt<bool>
PCAllWidths("pc-all-widths", llvm::cl::init(false));
llvm::cl::opt<bool>
PCPrefixWidth("pc-prefix-width", llvm::cl::init(true));
llvm::cl::opt<bool>
PCMultibyteReads("pc-multibyte-reads", llvm::cl::init(true));
llvm::cl::opt<bool>
PCAllConstWidths("pc-all-const-widths", llvm::cl::init(false));
}
class PPrinter : public ExprPPrinter {
public:
std::set<const Array*> usedArrays;
private:
std::map<ref<Expr>, unsigned> bindings;
std::map<const UpdateNode*, unsigned> updateBindings;
std::set< ref<Expr> > couldPrint, shouldPrint;
std::set<const UpdateNode*> couldPrintUpdates, shouldPrintUpdates;
llvm::raw_ostream &os;
unsigned counter;
unsigned updateCounter;
bool hasScan;
bool forceNoLineBreaks;
std::string newline;
/// shouldPrintWidth - Predicate for whether this expression should
/// be printed with its width.
bool shouldPrintWidth(ref<Expr> e) {
if (PCAllWidths)
return true;
return e->getWidth() != Expr::Bool;
}
bool isVerySimple(const ref<Expr> &e) {
return isa<ConstantExpr>(e) || bindings.find(e)!=bindings.end();
}
bool isVerySimpleUpdate(const UpdateNode *un) {
return !un || updateBindings.find(un)!=updateBindings.end();
}
// document me!
bool isSimple(const ref<Expr> &e) {
if (isVerySimple(e)) {
return true;
} else if (const ReadExpr *re = dyn_cast<ReadExpr>(e)) {
return isVerySimple(re->index) && isVerySimpleUpdate(re->updates.head);
} else {
Expr *ep = e.get();
for (unsigned i=0; i<ep->getNumKids(); i++)
if (!isVerySimple(ep->getKid(i)))
return false;
return true;
}
}
bool hasSimpleKids(const Expr *ep) {
for (unsigned i=0; i<ep->getNumKids(); i++)
if (!isSimple(ep->getKid(i)))
return false;
return true;
}
void scanUpdate(const UpdateNode *un) {
// FIXME: This needs to be non-recursive.
if (un) {
if (couldPrintUpdates.insert(un).second) {
scanUpdate(un->next);
scan1(un->index);
scan1(un->value);
} else {
shouldPrintUpdates.insert(un);
}
}
}
void scan1(const ref<Expr> &e) {
if (!isa<ConstantExpr>(e)) {
if (couldPrint.insert(e).second) {
Expr *ep = e.get();
for (unsigned i=0; i<ep->getNumKids(); i++)
scan1(ep->getKid(i));
if (const ReadExpr *re = dyn_cast<ReadExpr>(e)) {
usedArrays.insert(re->updates.root);
scanUpdate(re->updates.head);
}
} else {
shouldPrint.insert(e);
}
}
}
void printUpdateList(const UpdateList &updates, PrintContext &PC) {
const UpdateNode *head = updates.head;
// Special case empty list.
if (!head) {
// FIXME: We need to do something (assert, mangle, etc.) so that printing
// distinct arrays with the same name doesn't fail.
PC << updates.root->name;
return;
}
// FIXME: Explain this breaking policy.
bool openedList = false, nextShouldBreak = false;
unsigned outerIndent = PC.pos;
unsigned middleIndent = 0;
for (const UpdateNode *un = head; un; un = un->next) {
// We are done if we hit the cache.
std::map<const UpdateNode*, unsigned>::iterator it =
updateBindings.find(un);
if (it!=updateBindings.end()) {
if (openedList)
PC << "] @ ";
PC << "U" << it->second;
return;
} else if (!hasScan || shouldPrintUpdates.count(un)) {
if (openedList)
PC << "] @";
if (un != head)
PC.breakLine(outerIndent);
PC << "U" << updateCounter << ":";
updateBindings.insert(std::make_pair(un, updateCounter++));
openedList = nextShouldBreak = false;
}
if (!openedList) {
openedList = 1;
PC << '[';
middleIndent = PC.pos;
} else {
PC << ',';
printSeparator(PC, !nextShouldBreak, middleIndent);
}
//PC << "(=";
//unsigned innerIndent = PC.pos;
print(un->index, PC);
//printSeparator(PC, isSimple(un->index), innerIndent);
PC << "=";
print(un->value, PC);
//PC << ')';
nextShouldBreak = !(isa<ConstantExpr>(un->index) &&
isa<ConstantExpr>(un->value));
}
if (openedList)
PC << ']';
PC << " @ " << updates.root->name;
}
void printWidth(PrintContext &PC, ref<Expr> e) {
if (!shouldPrintWidth(e))
return;
if (PCWidthAsArg) {
PC << ' ';
if (PCPrefixWidth)
PC << 'w';
}
PC << e->getWidth();
}
bool isReadExprAtOffset(ref<Expr> e, const ReadExpr *base, ref<Expr> offset) {
const ReadExpr *re = dyn_cast<ReadExpr>(e.get());
// right now, all Reads are byte reads but some
// transformations might change this
if (!re || (re->getWidth() != Expr::Int8))
return false;
// Check if the index follows the stride.
// FIXME: How aggressive should this be simplified. The
// canonicalizing builder is probably the right choice, but this
// is yet another area where we would really prefer it to be
// global or else use static methods.
return SubExpr::create(re->index, base->index) == offset;
}
/// hasOrderedReads: \arg e must be a ConcatExpr, \arg stride must
/// be 1 or -1.
///
/// If all children of this Concat are reads or concats of reads
/// with consecutive offsets according to the given \arg stride, it
/// returns the base ReadExpr according to \arg stride: first Read
/// for 1 (MSB), last Read for -1 (LSB). Otherwise, it returns
/// null.
const ReadExpr* hasOrderedReads(ref<Expr> e, int stride) {
assert(e->getKind() == Expr::Concat);
assert(stride == 1 || stride == -1);
const ReadExpr *base = dyn_cast<ReadExpr>(e->getKid(0));
// right now, all Reads are byte reads but some
// transformations might change this
if (!base || base->getWidth() != Expr::Int8)
return NULL;
// Get stride expr in proper index width.
Expr::Width idxWidth = base->index->getWidth();
ref<Expr> strideExpr = ConstantExpr::alloc(stride, idxWidth);
ref<Expr> offset = ConstantExpr::create(0, idxWidth);
e = e->getKid(1);
// concat chains are unbalanced to the right
while (e->getKind() == Expr::Concat) {
offset = AddExpr::create(offset, strideExpr);
if (!isReadExprAtOffset(e->getKid(0), base, offset))
return NULL;
e = e->getKid(1);
}
offset = AddExpr::create(offset, strideExpr);
if (!isReadExprAtOffset(e, base, offset))
return NULL;
if (stride == -1)
return cast<ReadExpr>(e.get());
else return base;
}
#if 0
/// hasAllByteReads - True iff all children are byte level reads or
/// concats of byte level reads.
bool hasAllByteReads(const Expr *ep) {
switch (ep->kind) {
Expr::Read: {
// right now, all Reads are byte reads but some
// transformations might change this
return ep->getWidth() == Expr::Int8;
}
Expr::Concat: {
for (unsigned i=0; i<ep->getNumKids(); ++i) {
if (!hashAllByteReads(ep->getKid(i)))
return false;
}
}
default: return false;
}
}
#endif
void printRead(const ReadExpr *re, PrintContext &PC, unsigned indent) {
print(re->index, PC);
printSeparator(PC, isVerySimple(re->index), indent);
printUpdateList(re->updates, PC);
}
void printExtract(const ExtractExpr *ee, PrintContext &PC, unsigned indent) {
PC << ee->offset << ' ';
print(ee->expr, PC);
}
void printExpr(const Expr *ep, PrintContext &PC, unsigned indent, bool printConstWidth=false) {
bool simple = hasSimpleKids(ep);
print(ep->getKid(0), PC);
for (unsigned i=1; i<ep->getNumKids(); i++) {
printSeparator(PC, simple, indent);
print(ep->getKid(i), PC, printConstWidth);
}
}
public:
PPrinter(llvm::raw_ostream &_os) : os(_os), newline("\n") {
reset();
}
void setNewline(const std::string &_newline) {
newline = _newline;
}
void setForceNoLineBreaks(bool _forceNoLineBreaks) {
forceNoLineBreaks = _forceNoLineBreaks;
}
void reset() {
counter = 0;
updateCounter = 0;
hasScan = false;
forceNoLineBreaks = false;
bindings.clear();
updateBindings.clear();
couldPrint.clear();
shouldPrint.clear();
couldPrintUpdates.clear();
shouldPrintUpdates.clear();
}
void scan(const ref<Expr> &e) {
hasScan = true;
scan1(e);
}
void print(const ref<Expr> &e, unsigned level=0) {
PrintContext PC(os);
PC.pos = level;
print(e, PC);
}
void printConst(const ref<ConstantExpr> &e, PrintContext &PC,
bool printWidth) {
if (e->getWidth() == Expr::Bool)
PC << (e->isTrue() ? "true" : "false");
else {
if (PCAllConstWidths)
printWidth = true;
if (printWidth)
PC << "(w" << e->getWidth() << " ";
if (e->getWidth() <= 64) {
PC << e->getZExtValue();
} else {
std::string S;
e->toString(S);
PC << S;
}
if (printWidth)
PC << ")";
}
}
void print(const ref<Expr> &e, PrintContext &PC, bool printConstWidth=false) {
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(e))
printConst(CE, PC, printConstWidth);
else {
std::map<ref<Expr>, unsigned>::iterator it = bindings.find(e);
if (it!=bindings.end()) {
PC << 'N' << it->second;
} else {
if (!hasScan || shouldPrint.count(e)) {
PC << 'N' << counter << ':';
bindings.insert(std::make_pair(e, counter++));
}
// Detect multibyte reads.
// FIXME: Hrm. One problem with doing this is that we are
// masking the sharing of the indices which aren't
// visible. Need to think if this matters... probably not
// because if they are offset reads then its either constant,
// or they are (base + offset) and base will get printed with
// a declaration.
if (PCMultibyteReads && e->getKind() == Expr::Concat) {
const ReadExpr *base = hasOrderedReads(e, -1);
int isLSB = (base != NULL);
if (!isLSB)
base = hasOrderedReads(e, 1);
if (base) {
PC << "(Read" << (isLSB ? "LSB" : "MSB");
printWidth(PC, e);
PC << ' ';
printRead(base, PC, PC.pos);
PC << ')';
return;
}
}
PC << '(' << e->getKind();
printWidth(PC, e);
PC << ' ';
// Indent at first argument and dispatch to appropriate print
// routine for exprs which require special handling.
unsigned indent = PC.pos;
if (const ReadExpr *re = dyn_cast<ReadExpr>(e)) {
printRead(re, PC, indent);
} else if (const ExtractExpr *ee = dyn_cast<ExtractExpr>(e)) {
printExtract(ee, PC, indent);
} else if (e->getKind() == Expr::Concat || e->getKind() == Expr::SExt)
printExpr(e.get(), PC, indent, true);
else
printExpr(e.get(), PC, indent);
PC << ")";
}
}
}
/* Public utility functions */
void printSeparator(PrintContext &PC, bool simple, unsigned indent) {
if (simple || forceNoLineBreaks) {
PC << ' ';
} else {
PC.breakLine(indent);
}
}
};
ExprPPrinter *klee::ExprPPrinter::create(llvm::raw_ostream &os) {
return new PPrinter(os);
}
void ExprPPrinter::printOne(llvm::raw_ostream &os,
const char *message,
const ref<Expr> &e) {
PPrinter p(os);
p.scan(e);
// FIXME: Need to figure out what to do here. Probably print as a
// "forward declaration" with whatever syntax we pick for that.
PrintContext PC(os);
PC << message << ": ";
p.print(e, PC);
PC.breakLine();
}
void ExprPPrinter::printSingleExpr(llvm::raw_ostream &os, const ref<Expr> &e) {
PPrinter p(os);
p.scan(e);
// FIXME: Need to figure out what to do here. Probably print as a
// "forward declaration" with whatever syntax we pick for that.
PrintContext PC(os);
p.print(e, PC);
}
void ExprPPrinter::printConstraints(llvm::raw_ostream &os,
const ConstraintManager &constraints) {
printQuery(os, constraints, ConstantExpr::alloc(false, Expr::Bool));
}
void ExprPPrinter::printQuery(llvm::raw_ostream &os,
const ConstraintManager &constraints,
const ref<Expr> &q,
const ref<Expr> *evalExprsBegin,
const ref<Expr> *evalExprsEnd,
const Array * const *evalArraysBegin,
const Array * const *evalArraysEnd,
bool printArrayDecls) {
PPrinter p(os);
for (ConstraintManager::const_iterator it = constraints.begin(),
ie = constraints.end(); it != ie; ++it)
p.scan(*it);
p.scan(q);
for (const ref<Expr> *it = evalExprsBegin; it != evalExprsEnd; ++it)
p.scan(*it);
PrintContext PC(os);
// Print array declarations.
if (printArrayDecls) {
for (const Array * const* it = evalArraysBegin; it != evalArraysEnd; ++it)
p.usedArrays.insert(*it);
for (std::set<const Array*>::iterator it = p.usedArrays.begin(),
ie = p.usedArrays.end(); it != ie; ++it) {
const Array *A = *it;
// FIXME: Print correct name, domain, and range.
PC << "array " << A->name
<< "[" << A->size << "]"
<< " : " << "w32" << " -> " << "w8" << " = ";
if (A->isSymbolicArray()) {
PC << "symbolic";
} else {
PC << "[";
for (unsigned i = 0, e = A->size; i != e; ++i) {
if (i)
PC << " ";
PC << A->constantValues[i];
}
PC << "]";
}
PC.breakLine();
}
}
PC << "(query [";
// Ident at constraint list;
unsigned indent = PC.pos;
for (ConstraintManager::const_iterator it = constraints.begin(),
ie = constraints.end(); it != ie;) {
p.print(*it, PC);
++it;
if (it != ie)
PC.breakLine(indent);
}
PC << ']';
p.printSeparator(PC, constraints.empty(), indent-1);
p.print(q, PC);
// Print expressions to obtain values for, if any.
if (evalExprsBegin != evalExprsEnd) {
p.printSeparator(PC, q->isFalse(), indent-1);
PC << '[';
for (const ref<Expr> *it = evalExprsBegin; it != evalExprsEnd; ++it) {
p.print(*it, PC, /*printConstWidth*/true);
if (it + 1 != evalExprsEnd)
PC.breakLine(indent);
}
PC << ']';
}
// Print arrays to obtain values for, if any.
if (evalArraysBegin != evalArraysEnd) {
if (evalExprsBegin == evalExprsEnd)
PC << " []";
PC.breakLine(indent - 1);
PC << '[';
for (const Array * const* it = evalArraysBegin; it != evalArraysEnd; ++it) {
PC << (*it)->name;
if (it + 1 != evalArraysEnd)
PC.breakLine(indent);
}
PC << ']';
}
PC << ')';
PC.breakLine();
}
File diff suppressed because it is too large Load Diff
+135
View File
@@ -0,0 +1,135 @@
//===-- Updates.cpp -------------------------------------------------------===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "klee/Expr.h"
#include <cassert>
using namespace klee;
///
UpdateNode::UpdateNode(const UpdateNode *_next,
const ref<Expr> &_index,
const ref<Expr> &_value)
: refCount(0),
next(_next),
index(_index),
value(_value) {
// FIXME: What we need to check here instead is that _value is of the same width
// as the range of the array that the update node is part of.
/*
assert(_value->getWidth() == Expr::Int8 &&
"Update value should be 8-bit wide.");
*/
computeHash();
if (next) {
++next->refCount;
size = 1 + next->size;
}
else size = 1;
}
extern "C" void vc_DeleteExpr(void*);
UpdateNode::~UpdateNode() {
}
int UpdateNode::compare(const UpdateNode &b) const {
if (int i = index.compare(b.index))
return i;
return value.compare(b.value);
}
unsigned UpdateNode::computeHash() {
hashValue = index->hash() ^ value->hash();
if (next)
hashValue ^= next->hash();
return hashValue;
}
///
UpdateList::UpdateList(const Array *_root, const UpdateNode *_head)
: root(_root),
head(_head) {
if (head) ++head->refCount;
}
UpdateList::UpdateList(const UpdateList &b)
: root(b.root),
head(b.head) {
if (head) ++head->refCount;
}
UpdateList::~UpdateList() {
// We need to be careful and avoid recursion here. We do this in
// cooperation with the private dtor of UpdateNode which does not
// recursively free its tail.
while (head && --head->refCount==0) {
const UpdateNode *n = head->next;
delete head;
head = n;
}
}
UpdateList &UpdateList::operator=(const UpdateList &b) {
if (b.head) ++b.head->refCount;
if (head && --head->refCount==0) delete head;
root = b.root;
head = b.head;
return *this;
}
void UpdateList::extend(const ref<Expr> &index, const ref<Expr> &value) {
if (root) {
assert(root->getDomain() == index->getWidth());
assert(root->getRange() == value->getWidth());
}
if (head) --head->refCount;
head = new UpdateNode(head, index, value);
++head->refCount;
}
int UpdateList::compare(const UpdateList &b) const {
if (root->name != b.root->name)
return root->name < b.root->name ? -1 : 1;
// Check the root itself in case we have separate objects with the
// same name.
if (root != b.root)
return root < b.root ? -1 : 1;
if (getSize() < b.getSize()) return -1;
else if (getSize() > b.getSize()) return 1;
// XXX build comparison into update, make fast
const UpdateNode *an=head, *bn=b.head;
for (; an && bn; an=an->next,bn=bn->next) {
if (an==bn) { // exploit shared list structure
return 0;
} else {
if (int res = an->compare(*bn))
return res;
}
}
assert(!an && !bn);
return 0;
}
unsigned UpdateList::hash() const {
unsigned res = 0;
for (unsigned i = 0, e = root->name.size(); i != e; ++i)
res = (res * Expr::MAGIC_HASH_CONSTANT) + root->name[i];
if (head)
res ^= head->hash();
return res;
}
+202
View File
@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+42
View File
@@ -0,0 +1,42 @@
Dna.LLVMInterop Souper vendor notes
====================================
This directory is a limited, checked-in vendor copy of Souper source used by
Dna.LLVMInterop. It is intentionally not a git submodule and it is not a full
Souper checkout.
Likely upstream base
--------------------
The closest local upstream match found during dependency cleanup was:
repository: https://github.com/LLVMParty/souper
commit: 8648d11 ("Bump to llvm 17 (#875)")
Earlier local notes also referenced LLVMParty/souper commit 900fb8c
("cmake-package-v5"), but the current vendored files match the LLVM 17-era
8648d11 tree more closely.
Patch strategy
--------------
Keep the upstream Souper directory layout for the subset we vendor:
include/souper/...
include/klee/Config/config.h
lib/...
Dna-specific changes are kept directly in this tree. Do not overwrite this
folder with a clean upstream checkout unless the Dna patches are reapplied.
Known Dna/custom areas include:
* include/souper/Infer/Z3Driver.h and lib/Infer/Z3Driver.cpp
* include/souper/Infer/Z3Expr.h and lib/Infer/Z3Expr.cpp
* include/souper/Infer/Verification.h and lib/Infer/Verification.cpp
* custom Z3 verification/query solving used by Dna's Souper interop APIs
* local ExprBuilder/Candidates changes used for slicing and candidate filtering
* Windows/LLVM 17 build adaptations
When refreshing Souper, diff this directory against the chosen upstream base,
rebase the Dna-specific changes, and keep the resulting limited source set in
this folder.
@@ -12,5 +12,5 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#define LLVM_VERSION_MAJOR 15
#define LLVM_VERSION_MAJOR 17
#define LLVM_VERSION_MINOR 0
@@ -14,7 +14,6 @@
#include "souper/Codegen/Codegen.h"
#include "souper/Inst/Inst.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IRBuilder.h"
@@ -32,6 +31,7 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <map>
#include <optional>
#define DEBUG_TYPE "souper"
@@ -104,11 +104,16 @@ void getBackendCost(InstContext &IC, souper::Inst *I, BackendCost &BC) {
// TODO is this better than just forcing all clients of this code to
// do the init themselves?
if (!Init) {
InitializeAllTargetInfos();
InitializeAllTargets();
InitializeAllTargetMCs();
InitializeAllAsmParsers();
InitializeAllAsmPrinters();
LLVMInitializeX86TargetInfo();
LLVMInitializeX86Target();
LLVMInitializeX86TargetMC();
LLVMInitializeX86AsmParser();
LLVMInitializeX86AsmPrinter();
LLVMInitializeAArch64TargetInfo();
LLVMInitializeAArch64Target();
LLVMInitializeAArch64TargetMC();
LLVMInitializeAArch64AsmParser();
LLVMInitializeAArch64AsmPrinter();
Init = true;
}
@@ -132,7 +137,7 @@ void getBackendCost(InstContext &IC, souper::Inst *I, BackendCost &BC) {
auto Features = "";
TargetOptions Opt;
auto RM = llvm::Optional<Reloc::Model>();
auto RM = std::optional<Reloc::Model>();
auto TM = Target->createTargetMachine(T.Trip, T.CPU, Features, Opt, RM);
Cost.C.push_back(getCodeSize(M, TM));
@@ -18,7 +18,6 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Optional.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Program.h"
@@ -28,6 +27,7 @@
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <optional>
#include <system_error>
using namespace llvm;
@@ -311,7 +311,7 @@ SolverProgram souper::makeExternalSolverProgram(StringRef Path) {
std::vector<StringRef> ArgPtrs;
ArgPtrs.push_back(PathStr);
ArgPtrs.insert(ArgPtrs.end(), Args.begin(), Args.end());
Optional<StringRef> Redirects[] = {RedirectIn, RedirectOut, RedirectErr};
std::optional<StringRef> Redirects[] = {RedirectIn, RedirectOut, RedirectErr};
return sys::ExecuteAndWait(PathStr, ArgPtrs, std::nullopt, Redirects, Timeout);
};
}
+134 -504
View File
@@ -1,504 +1,134 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32228.430
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna", "Dna\Dna.csproj", "{27764F9E-FD92-4C25-8A67-C76389BF0837}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.ControlFlow", "Dna.ControlFlow\Dna.ControlFlow.csproj", "{0A69F908-3D88-4D0E-9F19-C35C14685CD8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TritonTranslator", "TritonTranslator\TritonTranslator\TritonTranslator.csproj", "{F2084D58-2087-4CB8-86CC-1112E98B7FF5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.Example", "Dna.Example\Dna.Example.csproj", "{C440355F-89E8-4D12-A6FF-48F377A3FEF3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.Synthesis", "Dna.Synthesis\Dna.Synthesis.csproj", "{609DED32-46DB-42F3-99D8-AE73A64FD92E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.DataStructures", "Dna.DataStructures\Dna.DataStructures.csproj", "{9007DD90-82F1-4950-8009-EF413D44917B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Unicorn.Net", "unicorn-net\src\Unicorn.Net\Unicorn.Net.csproj", "{47D397E7-098D-4058-9B19-DC01124ED897}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{09C09202-899C-4F09-9884-93AAAD5CF6A5}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dna.LLVMInterop", "Dna.LLVMInterop\Dna.LLVMInterop.vcxproj", "{E6A58095-9B8B-4830-BFEA-2947C4F2681A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TritonTranslator.Examples", "TritonTranslator\TritonTranslator.Examples\TritonTranslator.Examples.csproj", "{48698C75-4175-417F-B240-867BF49AD07D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SemanticExtractor", "TritonTranslator\SemanticExtractor\SemanticExtractor.csproj", "{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dna.GraphViewer", "Dna.GraphViewer", "{04AE44E7-347A-4EFB-ADBD-E446CDEA6E03}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.BinaryTranslator", "Dna.BinaryTranslator\Dna.BinaryTranslator.csproj", "{BE5BAE75-AECF-453B-AE6C-FFF87923E665}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RuntimePatches", "RuntimePatches\RuntimePatches.csproj", "{F2F3F076-8818-42BD-82C8-02683D88DDC4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLVMSharp", "LLVMSharp\sources\LLVMSharp\LLVMSharp.csproj", "{E18759AD-2ACD-4801-A05F-7545A62014EA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLVMSharp.Interop", "LLVMSharp\sources\LLVMSharp.Interop\LLVMSharp.Interop.csproj", "{D053CF35-18E8-419E-B7A3-ADD1A9711A57}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Espresso", "Simplifier\MSiMBA\Espresso\Espresso.vcxproj", "{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mba.FFI", "Simplifier\MSiMBA\Mba.FFI\Mba.FFI.vcxproj", "{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mba.Common", "Simplifier\MSiMBA\Mba.Common\Mba.Common.csproj", "{8A615E01-944F-422A-9DDE-ACF968438571}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mba.Simplifier", "Simplifier\Mba.Simplifier\Mba.Simplifier.csproj", "{3CE05F47-763D-4894-81FD-CDABE33CB744}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
MinSizeRel|Any CPU = MinSizeRel|Any CPU
MinSizeRel|x64 = MinSizeRel|x64
MinSizeRel|x86 = MinSizeRel|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
RelWithDebInfo|x64 = RelWithDebInfo|x64
RelWithDebInfo|x86 = RelWithDebInfo|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|Any CPU.ActiveCfg = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|Any CPU.Build.0 = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x64.ActiveCfg = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x64.Build.0 = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x86.ActiveCfg = Debug|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x86.Build.0 = Debug|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|x64.ActiveCfg = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|x64.Build.0 = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.MinSizeRel|x86.Build.0 = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|Any CPU.Build.0 = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x64.ActiveCfg = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x64.Build.0 = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x86.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x86.Build.0 = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|x64.Build.0 = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{27764F9E-FD92-4C25-8A67-C76389BF0837}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|Any CPU.ActiveCfg = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|Any CPU.Build.0 = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x64.ActiveCfg = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x64.Build.0 = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x86.ActiveCfg = Debug|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x86.Build.0 = Debug|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|x64.ActiveCfg = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|x64.Build.0 = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.MinSizeRel|x86.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|Any CPU.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x64.ActiveCfg = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x64.Build.0 = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x86.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x86.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|x64.Build.0 = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|Any CPU.ActiveCfg = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|Any CPU.Build.0 = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x64.ActiveCfg = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x64.Build.0 = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x86.ActiveCfg = Debug|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x86.Build.0 = Debug|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|x64.ActiveCfg = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|x64.Build.0 = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.MinSizeRel|x86.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|Any CPU.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x64.ActiveCfg = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x64.Build.0 = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x86.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x86.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|x64.Build.0 = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|Any CPU.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x64.ActiveCfg = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x64.Build.0 = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x86.ActiveCfg = Debug|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x86.Build.0 = Debug|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|Any CPU.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|Any CPU.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|x64.ActiveCfg = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|x64.Build.0 = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|x86.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.MinSizeRel|x86.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|Any CPU.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x64.ActiveCfg = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x64.Build.0 = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x86.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x86.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|x64.Build.0 = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x64.ActiveCfg = Debug|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x64.Build.0 = Debug|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x86.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x86.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|Any CPU.Build.0 = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x64.ActiveCfg = Release|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x64.Build.0 = Release|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x86.ActiveCfg = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x86.Build.0 = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x64.ActiveCfg = Debug|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x64.Build.0 = Debug|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x86.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x86.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|Any CPU.Build.0 = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x64.ActiveCfg = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x64.Build.0 = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x86.ActiveCfg = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x86.Build.0 = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{9007DD90-82F1-4950-8009-EF413D44917B}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x64.ActiveCfg = Debug|x64
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x64.Build.0 = Debug|x64
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x86.ActiveCfg = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x86.Build.0 = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|Any CPU.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x64.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x64.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x86.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x86.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{47D397E7-098D-4058-9B19-DC01124ED897}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|Any CPU.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|Any CPU.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x64.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x64.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x86.ActiveCfg = Debug|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x86.Build.0 = Debug|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|Any CPU.ActiveCfg = Debug|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|Any CPU.Build.0 = Debug|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|x64.ActiveCfg = Debug|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|x64.Build.0 = Debug|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|x86.ActiveCfg = Debug|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.MinSizeRel|x86.Build.0 = Debug|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|Any CPU.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|Any CPU.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x64.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x64.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x86.ActiveCfg = Release|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x86.Build.0 = Release|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|x64.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.RelWithDebInfo|x86.Build.0 = Release|Win32
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x64.ActiveCfg = Debug|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x64.Build.0 = Debug|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x86.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x86.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|Any CPU.Build.0 = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x64.ActiveCfg = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x64.Build.0 = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x86.ActiveCfg = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x86.Build.0 = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{48698C75-4175-417F-B240-867BF49AD07D}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|Any CPU.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x64.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x64.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x86.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x86.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|Any CPU.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x64.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x64.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x86.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x86.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x64.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x64.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x86.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x86.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|Any CPU.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x64.ActiveCfg = Debug|x64
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x64.Build.0 = Debug|x64
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x86.ActiveCfg = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x86.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x64.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x64.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x86.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x86.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|Any CPU.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x64.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x64.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x86.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x86.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|Any CPU.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x64.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x64.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x86.ActiveCfg = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x86.Build.0 = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|Any CPU.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x64.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x64.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x86.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x86.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|Any CPU.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x64.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x64.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x86.ActiveCfg = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x86.Build.0 = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|Any CPU.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x64.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x64.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x86.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x86.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|Any CPU.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|Any CPU.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x64.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x86.ActiveCfg = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x86.Build.0 = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|Any CPU.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|x64.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|x86.ActiveCfg = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.MinSizeRel|x86.Build.0 = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|Any CPU.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|Any CPU.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x64.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x86.ActiveCfg = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x86.Build.0 = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|x64.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.RelWithDebInfo|x86.Build.0 = Release|Win32
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|Any CPU.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|Any CPU.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x86.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x86.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|Any CPU.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|x86.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.MinSizeRel|x86.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|Any CPU.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|Any CPU.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x86.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x86.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|x86.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.RelWithDebInfo|x86.Build.0 = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x64.ActiveCfg = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x64.Build.0 = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x86.ActiveCfg = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x86.Build.0 = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|x64.ActiveCfg = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|x64.Build.0 = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|Any CPU.Build.0 = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x64.ActiveCfg = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x64.Build.0 = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x86.ActiveCfg = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x86.Build.0 = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|x64.Build.0 = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{8A615E01-944F-422A-9DDE-ACF968438571}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x64.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x64.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x86.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x86.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|Any CPU.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x64.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x64.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x86.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x86.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BBB4F831-939D-4106-9DEC-1108E2436B46}
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32228.430
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna", "Dna\Dna.csproj", "{27764F9E-FD92-4C25-8A67-C76389BF0837}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.ControlFlow", "Dna.ControlFlow\Dna.ControlFlow.csproj", "{0A69F908-3D88-4D0E-9F19-C35C14685CD8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TritonTranslator", "TritonTranslator\TritonTranslator\TritonTranslator.csproj", "{F2084D58-2087-4CB8-86CC-1112E98B7FF5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.Example", "Dna.Example\Dna.Example.csproj", "{C440355F-89E8-4D12-A6FF-48F377A3FEF3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.Synthesis", "Dna.Synthesis\Dna.Synthesis.csproj", "{609DED32-46DB-42F3-99D8-AE73A64FD92E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.DataStructures", "Dna.DataStructures\Dna.DataStructures.csproj", "{9007DD90-82F1-4950-8009-EF413D44917B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Unicorn.Net", "unicorn-net\src\Unicorn.Net\Unicorn.Net.csproj", "{47D397E7-098D-4058-9B19-DC01124ED897}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{09C09202-899C-4F09-9884-93AAAD5CF6A5}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dna.LLVMInterop", "Dna.LLVMInterop\Dna.LLVMInterop.vcxproj", "{E6A58095-9B8B-4830-BFEA-2947C4F2681A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TritonTranslator.Examples", "TritonTranslator\TritonTranslator.Examples\TritonTranslator.Examples.csproj", "{48698C75-4175-417F-B240-867BF49AD07D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SemanticExtractor", "TritonTranslator\SemanticExtractor\SemanticExtractor.csproj", "{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dna.GraphViewer", "Dna.GraphViewer", "{04AE44E7-347A-4EFB-ADBD-E446CDEA6E03}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dna.BinaryTranslator", "Dna.BinaryTranslator\Dna.BinaryTranslator.csproj", "{BE5BAE75-AECF-453B-AE6C-FFF87923E665}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RuntimePatches", "RuntimePatches\RuntimePatches.csproj", "{F2F3F076-8818-42BD-82C8-02683D88DDC4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLVMSharp", "LLVMSharp\sources\LLVMSharp\LLVMSharp.csproj", "{E18759AD-2ACD-4801-A05F-7545A62014EA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLVMSharp.Interop", "LLVMSharp\sources\LLVMSharp.Interop\LLVMSharp.Interop.csproj", "{D053CF35-18E8-419E-B7A3-ADD1A9711A57}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Espresso", "Simplifier\MSiMBA\Espresso\Espresso.vcxproj", "{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mba.FFI", "Simplifier\MSiMBA\Mba.FFI\Mba.FFI.vcxproj", "{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mba.Common", "Simplifier\MSiMBA\Mba.Common\Mba.Common.csproj", "{8A615E01-944F-422A-9DDE-ACF968438571}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mba.Simplifier", "Simplifier\Mba.Simplifier\Mba.Simplifier.csproj", "{3CE05F47-763D-4894-81FD-CDABE33CB744}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x64.ActiveCfg = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Debug|x64.Build.0 = Debug|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x64.ActiveCfg = Release|x64
{27764F9E-FD92-4C25-8A67-C76389BF0837}.Release|x64.Build.0 = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x64.ActiveCfg = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Debug|x64.Build.0 = Debug|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x64.ActiveCfg = Release|x64
{0A69F908-3D88-4D0E-9F19-C35C14685CD8}.Release|x64.Build.0 = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x64.ActiveCfg = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Debug|x64.Build.0 = Debug|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x64.ActiveCfg = Release|x64
{F2084D58-2087-4CB8-86CC-1112E98B7FF5}.Release|x64.Build.0 = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x64.ActiveCfg = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Debug|x64.Build.0 = Debug|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x64.ActiveCfg = Release|x64
{C440355F-89E8-4D12-A6FF-48F377A3FEF3}.Release|x64.Build.0 = Release|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x64.ActiveCfg = Debug|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Debug|x64.Build.0 = Debug|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x64.ActiveCfg = Release|x64
{609DED32-46DB-42F3-99D8-AE73A64FD92E}.Release|x64.Build.0 = Release|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x64.ActiveCfg = Debug|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Debug|x64.Build.0 = Debug|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x64.ActiveCfg = Release|x64
{9007DD90-82F1-4950-8009-EF413D44917B}.Release|x64.Build.0 = Release|x64
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x64.ActiveCfg = Debug|AnyCPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Debug|x64.Build.0 = Debug|AnyCPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x64.ActiveCfg = Release|AnyCPU
{47D397E7-098D-4058-9B19-DC01124ED897}.Release|x64.Build.0 = Release|AnyCPU
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x64.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Debug|x64.Build.0 = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x64.ActiveCfg = Release|x64
{E6A58095-9B8B-4830-BFEA-2947C4F2681A}.Release|x64.Build.0 = Release|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x64.ActiveCfg = Debug|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Debug|x64.Build.0 = Debug|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x64.ActiveCfg = Release|x64
{48698C75-4175-417F-B240-867BF49AD07D}.Release|x64.Build.0 = Release|x64
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x64.ActiveCfg = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Debug|x64.Build.0 = Debug|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x64.ActiveCfg = Release|Any CPU
{44DF442D-CD3D-4BC8-86F8-01DE3290CA38}.Release|x64.Build.0 = Release|Any CPU
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x64.ActiveCfg = Debug|x64
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Debug|x64.Build.0 = Debug|x64
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x64.ActiveCfg = Release|x64
{BE5BAE75-AECF-453B-AE6C-FFF87923E665}.Release|x64.Build.0 = Release|x64
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x64.ActiveCfg = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Debug|x64.Build.0 = Debug|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x64.ActiveCfg = Release|Any CPU
{F2F3F076-8818-42BD-82C8-02683D88DDC4}.Release|x64.Build.0 = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x64.ActiveCfg = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Debug|x64.Build.0 = Debug|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x64.ActiveCfg = Release|Any CPU
{E18759AD-2ACD-4801-A05F-7545A62014EA}.Release|x64.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x64.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Debug|x64.Build.0 = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x64.ActiveCfg = Release|Any CPU
{D053CF35-18E8-419E-B7A3-ADD1A9711A57}.Release|x64.Build.0 = Release|Any CPU
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Debug|x64.Build.0 = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x64.ActiveCfg = Release|x64
{C66D6CA2-8FA5-4512-8F14-2311A3BD7E1B}.Release|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Debug|x64.Build.0 = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x64.ActiveCfg = Release|x64
{FE5E55D5-A764-4CD9-B8A8-EAC3B2149C55}.Release|x64.Build.0 = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x64.ActiveCfg = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Debug|x64.Build.0 = Debug|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x64.ActiveCfg = Release|x64
{8A615E01-944F-422A-9DDE-ACF968438571}.Release|x64.Build.0 = Release|x64
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x64.ActiveCfg = Debug|AnyCPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Debug|x64.Build.0 = Debug|AnyCPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x64.ActiveCfg = Release|AnyCPU
{3CE05F47-763D-4894-81FD-CDABE33CB744}.Release|x64.Build.0 = Release|AnyCPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BBB4F831-939D-4106-9DEC-1108E2436B46}
EndGlobalSection
EndGlobal
-6
View File
@@ -55,7 +55,6 @@
<ProjectReference Include="..\Dna.ControlFlow\Dna.ControlFlow.csproj" />
<ProjectReference Include="..\Dna.DataStructures\Dna.DataStructures.csproj" />
<ProjectReference Include="..\Dna.LLVMInterop\Dna.LLVMInterop.vcxproj">
<IncludeAssets>..\..\llvm-project-15.0.7.src\llvm\build\RelWithDebInfo\bin\LLVM-C.dll</IncludeAssets>
<Private>True</Private>
<CopyLocalSatelliteAssemblies>True</CopyLocalSatelliteAssemblies>
</ProjectReference>
@@ -68,10 +67,5 @@
<ProjectReference Include="..\unicorn-net\src\Unicorn.Net\Unicorn.Net.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="..\llvm-15.0.3-win64\bin\LLVM-C.dll" Link="LLVM-C.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
+50 -1
View File
@@ -32,4 +32,53 @@ Note that `Dna` is currently based on LLVM 17.
`Dna` contains a VMProtect devirtualization plugin located in `Dna.BinaryTranslator/VMProtect`. See [this PR](https://github.com/Colton1skees/Dna/pull/8) for more info.
# Building
`Dna` will not build out of the box. Custom patches to remill and souper were needed for this to build on windows. If you would like to work on Dna, open an issue or email me `colton1skees@gmail.com`. At some point I may publish proper build steps, but I make no guarantees.
Dna currently targets LLVM 17 and is expected to be built on Windows x64 with Visual Studio 2022.
Build `Dna.LLVMInterop` in **Release** mode; the native dependency tree is Release-built and Debug interop builds are not supported.
## Prerequisites
- Visual Studio 2022 with C++/MSBuild tools
- CMake
- Ninja
- clang-cl / LLVM tools available from the VS toolchain
- Rust/Cargo, for the EqSat simplifier DLL
- .NET SDK 8+
Run the commands below from a VS x64 developer shell, or another shell with the VS C++ tools on `PATH`.
## 1. Build native dependencies
The dependency superbuild installs LLVM 17, Remill, Z3, XED, gflags/glog, and related native libraries into `Dna.LLVMInterop/dependencies/install`.
```powershell
cmake -S Dna.LLVMInterop/dependencies `
-B Dna.LLVMInterop/dependencies/build `
-G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_COMPILER=clang-cl `
-DCMAKE_CXX_COMPILER=clang-cl
cmake --build Dna.LLVMInterop/dependencies/build
```
If changing compiler, build type, or CRT settings, delete both `Dna.LLVMInterop/dependencies/build` and `Dna.LLVMInterop/dependencies/install` before reconfiguring.
## 2. Build the Rust simplifier DLL
`Dna.Example` and the simplifier projects copy `eq_sat.dll` from the Cargo release output.
```powershell
cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release
```
## 3. Build the solution
```powershell
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
Dna.sln `
/restore `
/p:Configuration=Release `
/p:Platform=x64 `
/m
```