From 978277097e412930a26dc966cd63bd14453566ef Mon Sep 17 00:00:00 2001
From: bdr7fv <bdr7fv@git.zephyr-software.com>
Date: Wed, 23 Nov 2011 15:42:34 +0000
Subject: [PATCH] The t&e version of PN will now ignore functions that do not
 deallocate the stack.

Former-commit-id: b81c323334b442dbbc8f1a64115bf6066ff48a39
---
 tools/transforms/OffsetInference.cpp   | 20 ++++++++++++++++++++
 tools/transforms/PNTransformDriver.cpp |  1 +
 2 files changed, 21 insertions(+)

diff --git a/tools/transforms/OffsetInference.cpp b/tools/transforms/OffsetInference.cpp
index 92dabbaa7..20a7437d0 100644
--- a/tools/transforms/OffsetInference.cpp
+++ b/tools/transforms/OffsetInference.cpp
@@ -171,6 +171,8 @@ PNStackLayout* OffsetInference::SetupLayout(BasicBlock_t *entry, Function_t *fun
 //TODO: what about moving esp into a register?
 
 //TODO: Try catches for exceptions thrown by PNStackLayout, for now asserts will fail in PNStackLayout
+
+//TODO: For t&e this function will 
 void OffsetInference::FindAllOffsets(Function_t *func)
 {
     PNStackLayout *pn_all_offsets = NULL;
@@ -198,6 +200,10 @@ void OffsetInference::FindAllOffsets(Function_t *func)
 
     pn_all_offsets = SetupLayout(block,func);
 
+    //TODO: this is just for t&e, remove for other versions,
+    //for t&e don't produce an inference if not dealloc is found
+    bool dealloc_flag=false;
+
     if(pn_all_offsets != NULL)
     {
 	unsigned int stack_frame_size = pn_all_offsets->GetOriginalAllocSize();
@@ -460,12 +466,26 @@ void OffsetInference::FindAllOffsets(Function_t *func)
 		}		    
 	    }
 	}
+	else if(regexec(&(pn_regex.regex_stack_dealloc), disasm_str.c_str(), max, pmatch, 0)==0)
+	{
+	    //if we find a dealloc, set a flag indicating as such
+	    dealloc_flag = true;
+	}
 	else
 	{
 	    cerr<<"OffsetInference: FindAllOffsets: No Pattern Match"<<endl;
 	}
     }
 
+    //if no dealloc is found, set all inferences to null
+    if(!dealloc_flag)
+    {
+	pn_direct_offsets = NULL;
+	pn_scaled_offsets = NULL;
+	pn_all_offsets = NULL;
+	pn_p1_offsets = NULL;
+    }
+
     direct[func->GetName()] = pn_direct_offsets;
     scaled[func->GetName()] = pn_scaled_offsets;
     all_offsets[func->GetName()] = pn_all_offsets;
diff --git a/tools/transforms/PNTransformDriver.cpp b/tools/transforms/PNTransformDriver.cpp
index 5839362f2..754af3c22 100644
--- a/tools/transforms/PNTransformDriver.cpp
+++ b/tools/transforms/PNTransformDriver.cpp
@@ -504,6 +504,7 @@ void PNTransformDriver::GenerateTransforms(VariantIR_t *virp, string BED_script,
 }
 
 
+//TODO: rewrite, this was a hackish solution to clean up the code for the hierarchy, which isn't even used for T&E
 vector<PNStackLayout*> PNTransformDriver::GenerateInferences(Function_t *func,int level)
 {
     vector<PNStackLayout*> layouts;
-- 
GitLab