From 6e9e28bda671a6f8dab53ba204a0bd05c628768f Mon Sep 17 00:00:00 2001 From: Colton1skees Date: Sat, 2 May 2026 18:51:20 -0400 Subject: [PATCH] Implement missing atomic intrinsics; Implement missing nodes in ast conversion code --- .../Unsafe/UnsafeRuntimeImplementer.cs | 12 ++++++++++-- .../API/LLVMBindings/Analysis/MemoryAccess.cs | 2 ++ Dna/Passes/LLVMToTritonAst.cs | 4 ++-- Dna/Passes/MultiUseCloningPass.cs | 3 ++- LLVMSharp | 2 +- TritonTranslator | 2 +- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Dna.BinaryTranslator/Unsafe/UnsafeRuntimeImplementer.cs b/Dna.BinaryTranslator/Unsafe/UnsafeRuntimeImplementer.cs index 2f9f7bd..605519a 100644 --- a/Dna.BinaryTranslator/Unsafe/UnsafeRuntimeImplementer.cs +++ b/Dna.BinaryTranslator/Unsafe/UnsafeRuntimeImplementer.cs @@ -61,9 +61,12 @@ namespace Dna.BinaryTranslator.Unsafe { var writePrefix = "__remill_write_memory_"; var readPrefix = "__remill_read_memory"; + var atomicBeginPrefix = "__remill_atomic_begin"; + var atomicEndPrefix = "__remill_atomic_end"; + var atomicBarrierPrefix = "__remill_barrier_store_load"; var memFunctions = module.GetFunctions() - .Where(x => x.Name.Contains(writePrefix) || x.Name.Contains(readPrefix)) + .Where(x => x.Name.Contains(writePrefix) || x.Name.Contains(readPrefix) || x.Name.Contains(atomicBeginPrefix) || x.Name.Contains(atomicEndPrefix) || x.Name.Contains(atomicBarrierPrefix)) .ToList(); foreach (var function in memFunctions) @@ -85,7 +88,7 @@ namespace Dna.BinaryTranslator.Unsafe else if (function.Name.Contains(readPrefix)) ImplementMemRead(function, localMemPtr); else - throw new InvalidOperationException($"Cannot implement memory intrinsic: {function}"); + ImplementAtomic(function); // Mark the function for inlining. LLVMCloning.InlineFunction(function); @@ -130,5 +133,10 @@ namespace Dna.BinaryTranslator.Unsafe var loadValue = builder.BuildLoad2(valueType, loadPointer); builder.BuildRet(loadValue); } + + private void ImplementAtomic(LLVMValueRef function) + { + builder.BuildRet(function.GetParam(0)); + } } } diff --git a/Dna/LLVMInterop/API/LLVMBindings/Analysis/MemoryAccess.cs b/Dna/LLVMInterop/API/LLVMBindings/Analysis/MemoryAccess.cs index ccfec10..0a1c471 100644 --- a/Dna/LLVMInterop/API/LLVMBindings/Analysis/MemoryAccess.cs +++ b/Dna/LLVMInterop/API/LLVMBindings/Analysis/MemoryAccess.cs @@ -53,6 +53,8 @@ namespace Dna.LLVMInterop.API.LLVMBindings.Analysis public unsafe static implicit operator LLVMOpaqueMemoryAccess*(MemoryAccess memAccess) { + if (memAccess == null) + return null; return (LLVMOpaqueMemoryAccess*)memAccess.Handle; } diff --git a/Dna/Passes/LLVMToTritonAst.cs b/Dna/Passes/LLVMToTritonAst.cs index c2be595..1a57075 100644 --- a/Dna/Passes/LLVMToTritonAst.cs +++ b/Dna/Passes/LLVMToTritonAst.cs @@ -203,7 +203,7 @@ namespace Dna.Passes CondType.Uge => astCtx.bvuge(op1(), op2()), CondType.Ugt => astCtx.bvugt(op1(), op2()), CondType.Ule => astCtx.bvule(op1(), op2()), - //CondType.Ult => astCtx.bvult(op1(), op2()), + CondType.Ult => astCtx.bvnot(astCtx.bvuge(op1(), op2())), _ => throw new InvalidOperationException(string.Format("CondType {0} is not valid.", predicate)) }; @@ -264,7 +264,7 @@ namespace Dna.Passes case LLVMOpcode.LLVMZExt: var zxTy = inst.TypeOf; var srcZxTy = inst.GetOperand(0).TypeOf; - emit(astCtx.zx(astCtx.bv(zxTy.IntWidth - srcZxTy.IntWidth, zxTy.IntWidth), op1())); + emit(astCtx.zx(astCtx.bv(zxTy.IntWidth - srcZxTy.IntWidth, srcZxTy.IntWidth), op1())); break; // If the value is a load inst, create a substitution variable to represent it. // Do the same thing with phi nodes and function calls. diff --git a/Dna/Passes/MultiUseCloningPass.cs b/Dna/Passes/MultiUseCloningPass.cs index 79920d2..aeb357b 100644 --- a/Dna/Passes/MultiUseCloningPass.cs +++ b/Dna/Passes/MultiUseCloningPass.cs @@ -57,7 +57,6 @@ namespace Dna.Passes var ast = llvmToTriton.GetAst(inst); // TODO: Re-enable size check when the ast size change is pushed up to master - Debugger.Break(); /* if (ast.astSize > 2000) continue; @@ -170,6 +169,8 @@ namespace Dna.Passes BvultNode ultNode => builder.BuildICmp(LLVMIntPredicate.LLVMIntULT, op1(), op2()), BvsltNode sltNode => builder.BuildICmp(LLVMIntPredicate.LLVMIntSLT, op1(), op2()), BvugtNode bvugtNode => builder.BuildICmp(LLVMIntPredicate.LLVMIntUGT, op1(), op2()), + BvuleNode uleNode => builder.BuildICmp(LLVMIntPredicate.LLVMIntULE, op1(), op2()), + BvugeNode ugeNode => builder.BuildICmp(LLVMIntPredicate.LLVMIntUGE, op1(), op2()), ExtractNode extractNode => LowerExtract(cache, substitutionMapping, builder, extractNode), BvuremNode uremNode => builder.BuildURem(op1(), op2()), BvudivNode uremNode => builder.BuildUDiv(op1(), op2()), diff --git a/LLVMSharp b/LLVMSharp index 3406af0..25d21d3 160000 --- a/LLVMSharp +++ b/LLVMSharp @@ -1 +1 @@ -Subproject commit 3406af09e3c24cab3bfbf5487a3a4ce230932328 +Subproject commit 25d21d32da7976fcf7d6214af881a3f03d79345e diff --git a/TritonTranslator b/TritonTranslator index e2b1ad9..c86dc54 160000 --- a/TritonTranslator +++ b/TritonTranslator @@ -1 +1 @@ -Subproject commit e2b1ad9efcac58c0ec8305564a01f292e0784c9c +Subproject commit c86dc5439965d402f1c1dd3873ee39fe5efe5448