From f483455798b025cc10b97957f4c5100bd217a58d Mon Sep 17 00:00:00 2001
From: whh8b <whh8b@git.zephyr-software.com>
Date: Fri, 16 Oct 2015 19:10:44 +0000
Subject: [PATCH] Update 'main' zipr for new options.

---
 include/zipr_all.h       |   1 -
 include/zipr_impl.h      |  34 ++++++++--
 include/zipr_mem_space.h |  11 +--
 src/memory_space.cpp     |   9 ++-
 src/zipr.cpp             | 141 +++++++++++++++++++++++++++------------
 src/zipr_stats.cpp       |   4 +-
 test/MemorySpace.cpp     |  36 +++-------
 7 files changed, 151 insertions(+), 85 deletions(-)

diff --git a/include/zipr_all.h b/include/zipr_all.h
index d4f119f..d705355 100644
--- a/include/zipr_all.h
+++ b/include/zipr_all.h
@@ -54,7 +54,6 @@ using namespace Zipr_SDK;
 #include <plugin_man.h>
 #include <zipr_impl.h>
 #include <zipr_optimizations.h>
-#include <zipr_opts.h>
 #include <zipr_stats.h>
 };
 
diff --git a/include/zipr_impl.h b/include/zipr_impl.h
index e03d9b9..9667eca 100644
--- a/include/zipr_impl.h
+++ b/include/zipr_impl.h
@@ -31,26 +31,37 @@
 #ifndef zipr_impl_h
 #define zipr_impl_h
 
-class ZiprOptions_t;
+#include <random>
+#include <climits>
 class Stats_t;
 
 class ZiprImpl_t : public Zipr_t
 {
 	public:
-		ZiprImpl_t(libIRDB::FileIR_t* p_firp, ZiprOptions_t &p_opts) :
+		ZiprImpl_t(libIRDB::FileIR_t* p_firp, ZiprOptions_t *p_opts) :
 			m_firp(p_firp), 
-			m_opts(p_opts), 
 			m_stats(NULL), 
 			elfiop(new ELFIO::elfio), 
 			start_of_new_space(0),
-			memory_space(&p_opts), 
-			plugman(&memory_space, elfiop, p_firp, (Zipr_SDK::Options_t*)&p_opts, &final_insn_locations)
+			memory_space(),
+			m_output_filename("output", "b.out"),
+			m_callbacks("callbacks"),
+			m_objcopy("objcopy", "/usr/bin/objcopy"),
+			m_replop("replop", false),
+			m_verbose("verbose", true),
+			m_variant("variant"),
+			m_architecture("architecture"),
+			random_int_distribution(1,INT_MAX),
+			m_seed("seed", random_int_distribution(random_generator))
 		{ 
 			bss_needed=0;
 			use_stratafier_mode=false;
 
+			p_opts->AddNamespace(RegisterOptions(p_opts->Namespace("global")));
+			plugman = ZiprPluginManager_t(&memory_space, elfiop, p_firp, p_opts, &final_insn_locations);
+
 			// init  pinned addresses map.
-			RecordPinnedInsnAddrs();
+			//RecordPinnedInsnAddrs();
  		};
 
 		void CreateBinaryFile(const std::string &name);
@@ -60,11 +71,11 @@ class ZiprImpl_t : public Zipr_t
 		Zipr_SDK::RangeAddress_t PlopWithTarget(libIRDB::Instruction_t* insn, Zipr_SDK::RangeAddress_t at);
 		Zipr_SDK::RangeAddress_t PlopWithCallback(libIRDB::Instruction_t* insn, Zipr_SDK::RangeAddress_t at);
 
+		ZiprOptionsNamespace_t *RegisterOptions(ZiprOptionsNamespace_t *);
 	private:
 
 		// data for the stuff we're rewriting.
 		libIRDB::FileIR_t* m_firp;
-		ZiprOptions_t& m_opts;
 		Stats_t *m_stats;
 
 		Zipr_SDK::RangeAddress_t _PlopInstruction(libIRDB::Instruction_t*, Zipr_SDK::RangeAddress_t);
@@ -147,6 +158,15 @@ class ZiprImpl_t : public Zipr_t
 		ZiprPluginManager_t plugman;
 
 		std::map<libIRDB::Instruction_t*,DLFunctionHandle_t> plopping_plugins;
+
+		// Options
+		ZiprStringOption_t m_output_filename, m_callbacks, m_objcopy;
+		ZiprBooleanOption_t m_replop, m_verbose;
+		ZiprIntegerOption_t m_variant, m_architecture, m_seed;
+
+		// For default seed generation.
+		std::default_random_engine random_generator;
+		std::uniform_int_distribution<int> random_int_distribution;
 };
 
 #endif
diff --git a/include/zipr_mem_space.h b/include/zipr_mem_space.h
index ef32e44..a99c128 100644
--- a/include/zipr_mem_space.h
+++ b/include/zipr_mem_space.h
@@ -31,17 +31,16 @@
 #ifndef memory_space_h
 #define memory_space_h
 
-class ZiprOptions_t;
-
 // a memory space _is_ a map of range addres to char, with additional functionality.
 class ZiprMemorySpace_t : public MemorySpace_t
 {
 	public:
-		ZiprMemorySpace_t(ZiprOptions_t *opts) :
-			free_ranges(), m_opts(opts), max_plopped(0), min_plopped(-1)
+		ZiprMemorySpace_t() :
+			free_ranges(), max_plopped(0), min_plopped(-1), m_verbose("verbose")
 		{ 
 		}
 
+
 		// range operatations
 		void SplitFreeRange(RangeAddress_t addr);
 		void MergeFreeRange(RangeAddress_t addr);
@@ -83,14 +82,16 @@ class ZiprMemorySpace_t : public MemorySpace_t
 		RangeAddress_t GetMinPlopped() const { return min_plopped; }
 		RangeAddress_t GetMaxPlopped() const { return max_plopped; }
 
+		ZiprOptionsNamespace_t *RegisterOptions(ZiprOptionsNamespace_t*);
+
 	protected:
 		RangeSet_t  free_ranges; // keep ordered
 		// std::set<Range_t, Range_tCompare> free_ranges;   // keep ordered
-		ZiprOptions_t *m_opts;
 
 	private:
 		RangeAddress_t max_plopped;
 		RangeAddress_t min_plopped;
+		ZiprBooleanOption_t m_verbose;
 };
 
 #endif
diff --git a/src/memory_space.cpp b/src/memory_space.cpp
index 9ab4b38..b409e29 100644
--- a/src/memory_space.cpp
+++ b/src/memory_space.cpp
@@ -31,6 +31,11 @@
 using namespace zipr;
 using namespace std;
 
+ZiprOptionsNamespace_t *ZiprMemorySpace_t::RegisterOptions(ZiprOptionsNamespace_t *global) {
+	global->AddOption(&m_verbose);
+	return NULL;
+}
+
 void ZiprMemorySpace_t::SplitFreeRange(RangeAddress_t addr)
 {
 	RangeSet_t::iterator it=FindFreeRange(addr);
@@ -89,7 +94,7 @@ void ZiprMemorySpace_t::MergeFreeRange(RangeAddress_t addr)
 		 * one byte smaller!
 		 */
 		Range_t nnr(addr, r.GetEnd());
-		if(m_opts != NULL && m_opts->GetVerbose())
+		if (m_verbose)
 		{
 			printf("Expanded range:\n");
 			printf("from: %p to %p\n", (void*)r.GetStart(), (void*)r.GetEnd());
@@ -114,7 +119,7 @@ void ZiprMemorySpace_t::MergeFreeRange(RangeAddress_t addr)
 		 * bigger
 		 */
 		Range_t nnr(r.GetStart(), addr);
-		if(m_opts != NULL && m_opts->GetVerbose())
+		if (m_verbose)
 		{
 			printf("Expanded range:\n");
 			printf("from: %p to %p\n", (void*)r.GetStart(), (void*)r.GetEnd());
diff --git a/src/zipr.cpp b/src/zipr.cpp
index a96afe9..0ce5c42 100644
--- a/src/zipr.cpp
+++ b/src/zipr.cpp
@@ -67,6 +67,36 @@ static std::ifstream::pos_type filesize(const char* filename)
    	return in.tellg();
 }
 
+ZiprOptionsNamespace_t *ZiprImpl_t::RegisterOptions(ZiprOptionsNamespace_t *global)
+{
+	ZiprOptionsNamespace_t *zipr_namespace = new ZiprOptionsNamespace_t("zipr");
+
+	m_variant.SetRequired(true);
+
+	m_verbose.SetDescription("Enable verbose output");
+	m_variant.SetDescription("Variant ID.");
+	m_output_filename.SetDescription("Output file name.");
+	m_architecture.SetDescription("Override default system "
+		"architecture detection");
+	m_replop.SetDescription("Replop all dollops.");
+	m_objcopy.SetDescription("Set the path of objcopy to use.");
+	m_callbacks.SetDescription("Set the path of the file "
+		"which contains any required callbacks.");
+	m_seed.SetDescription("Seed the random number generator with this value.");
+
+	zipr_namespace->AddOption(&m_output_filename);
+	zipr_namespace->AddOption(&m_callbacks);
+	zipr_namespace->AddOption(&m_architecture);
+	zipr_namespace->AddOption(&m_replop);
+	zipr_namespace->AddOption(&m_objcopy);
+	zipr_namespace->AddOption(&m_seed);
+
+	global->AddOption(&m_variant);
+	global->AddOption(&m_verbose);
+
+	zipr_namespace->MergeNamespace(memory_space.RegisterOptions(global));
+	return zipr_namespace;
+}
 
 void ZiprImpl_t::CreateBinaryFile(const std::string &name)
 {
@@ -91,6 +121,22 @@ void ZiprImpl_t::CreateBinaryFile(const std::string &name)
 	}
 #endif
 
+	if (m_architecture == 0)
+	{
+		if (m_verbose)
+			cout << "Doing architecture autodetection." << endl;
+		m_architecture.SetValue(libIRDB::FileIR_t::GetArchitectureBitWidth());
+		if (m_verbose)
+			cout << "Autodetected to " << (int)m_architecture << endl;
+	}
+
+	/*
+	 * Take the seed and initialize the random number
+	 * generator.
+	 */
+	std::srand((unsigned)m_seed);
+	if (m_verbose)
+		cout << "Seeded the random number generator with " << m_seed << "." << endl;
 
 	// create ranges, including extra range that's def. big enough.
 	FindFreeRanges(name);
@@ -105,10 +151,13 @@ void ZiprImpl_t::CreateBinaryFile(const std::string &name)
 
 	// Emit instruction immediately?
 
+	//TODO: Reenable after option parsing is fixed.
+#if 0
 	if (m_opts.IsEnabledOptimization(Optimizations_t::OptimizationFallthroughPinned))
 	{
 		OptimizePinnedFallthroughs();
 	}
+#endif
 
 	PreReserve2ByteJumpTargets();
 
@@ -254,7 +303,7 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 		RangeAddress_t start=sec->get_address();
 		RangeAddress_t end=sec->get_size()+start-1;
 
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Section %s:\n", sec->get_name().c_str());
 
 #ifdef CGC
@@ -299,11 +348,11 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 
 		}
 
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("max_addr is %p, end is %p\n", (void*)max_addr, (void*)end);
 		if(start && end>max_addr)
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("new max_addr is %p\n", (void*)max_addr);
 			max_addr=end;
 		}
@@ -316,7 +365,7 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 		{
 			assert(start>last_end);
 			last_end=end;
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Adding free range 0x%p to 0x%p\n", (void*)start,(void*)end);
 			memory_space.AddFreeRange(Range_t(start,end));
 		}
@@ -367,7 +416,7 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 #endif
 
 	memory_space.AddFreeRange(Range_t(new_free_page,(RangeAddress_t)-1));
-	if(m_opts.GetVerbose())
+	if (m_verbose)
 		printf("Adding (mysterious) free range 0x%p to EOF\n", (void*)new_free_page);
 	start_of_new_space=new_free_page;
 }
@@ -508,7 +557,7 @@ bool ZiprImpl_t::ShouldPinImmediately(Instruction_t *upinsn)
 	 * x+1 should become the entire lock command.
 	 */
 	{
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			cout<<"Using pin_at_next_byte special case, addrs="<<
 				upinsn_ibta->GetVirtualOffset()<<","<<
 				pin_at_next_byte->GetAddress()->GetVirtualOffset()<<endl;
@@ -570,7 +619,7 @@ void ZiprImpl_t::OptimizePinnedFallthroughs()
 			  (up_insn->GetCallback()=="") &&
 			  (!up_insn->GetTarget()))
 		{
-			if (m_opts.GetVerbose())
+			if (m_verbose)
 			{
 				cout<<"Emitting pinned instruction (0x"<<std::hex<<up_ibta->GetVirtualOffset()<< ") with pinned fallthrough next.\n";
 			}
@@ -626,13 +675,13 @@ void ZiprImpl_t::PreReserve2ByteJumpTargets()
 		 */
 		for(int size=5;size>0;size-=3) 
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Looking for %d-byte jump targets to pre-reserve.\n", size);
 			for(int i=120;i>=-120;i--)
 			{
 				if(memory_space.AreBytesFree(addr+i,size))
 				{
-					if(m_opts.GetVerbose())
+					if (m_verbose)
 						printf("Found location for 2-byte->%d-byte conversion "
 						"(%p-%p)->(%p-%p) (orig: %p)\n", 
 						size,
@@ -706,7 +755,7 @@ void ZiprImpl_t::ReservePinnedInstructions()
 		 */
 		if(ShouldPinImmediately(upinsn))
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Final pinning %p-%p.  fid=%d\n", (void*)addr, (void*)(addr+upinsn->GetDataBits().size()-1),
 				upinsn->GetAddress()->GetFileID());
 			for(unsigned int i=0;i<upinsn->GetDataBits().size();i++)
@@ -718,7 +767,7 @@ void ZiprImpl_t::ReservePinnedInstructions()
 			continue;
 		}
 
-		if (m_opts.GetVerbose()) {
+		if (m_verbose) {
 			printf("Working two byte pinning decision at %p for:\n", 
 					(void*)addr);
 			printf("%s\n", upinsn->GetComment().c_str());
@@ -726,7 +775,7 @@ void ZiprImpl_t::ReservePinnedInstructions()
 
 
 		if (FindPinnedInsnAtAddr(addr+1)) {
-			if (m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Cannot fit two byte pin; Using workaround.\n");
 			UnresolvedPinned_t cup = UnresolvedPinned_t(up.GetInstruction());
 			char push_bytes[]={(char)0x68,(char)0x00, /* We do not actually write */
@@ -780,7 +829,7 @@ void ZiprImpl_t::ReservePinnedInstructions()
 
 			addr += sizeof(push_bytes) + lea_bytes_size;
 
-			if (m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Advanced addr to %p\n", (void*)addr);
 
 			/*
@@ -791,7 +840,7 @@ void ZiprImpl_t::ReservePinnedInstructions()
 			cup.SetUpdatedAddress(addr);
 			two_byte_pins.insert(cup);
 		} else {
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 			{
 				printf("Can fit two-byte pin (%p-%p).  fid=%d\n", 
 					(void*)addr,
@@ -841,7 +890,7 @@ void ZiprImpl_t::ExpandPinnedInstructions()
 		bool can_update=memory_space.AreBytesFree(addr+2,sizeof(bytes)-2);
 		if(can_update)
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Found %p can be updated to 5-byte jmp\n", (void*)addr);
 			memory_space.PlopJump(addr);
 
@@ -862,7 +911,7 @@ void ZiprImpl_t::ExpandPinnedInstructions()
 		else
 		{
 			++it;
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Found %p can NOT be updated to 5-byte jmp\n", (void*)addr);
 			m_stats->total_2byte_pins++;
 			m_stats->total_trampolines++;
@@ -906,7 +955,7 @@ void ZiprImpl_t::Fix2BytePinnedInstructions()
 
 			if (up.GetRange().Is5ByteRange()) 
 			{
-				if(m_opts.GetVerbose())
+				if (m_verbose)
 					printf("Using previously reserved spot of 2-byte->5-byte conversion "
 					"(%p-%p)->(%p-%p) (orig: %p)\n", 
 					(void*)addr,
@@ -946,7 +995,7 @@ void ZiprImpl_t::Fix2BytePinnedInstructions()
 					assert(!memory_space.IsByteFree(up.GetRange().GetStart()+i));
 				}
 
-				if(m_opts.GetVerbose())
+				if (m_verbose)
 					printf("Patching 2 byte to 2 byte: %p to %p (orig: %p)\n", 
 					(void*)addr,
 					(void*)up.GetRange().GetStart(),
@@ -1001,7 +1050,7 @@ void ZiprImpl_t::OptimizePinnedInstructions()
 		}
 		else
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Converting 5-byte pinned jump at %p-%p to patch to %d:%s\n", 
 				(void*)addr,(void*)(addr+4), uu.GetInstruction()->GetBaseID(), d.CompleteInstr);
 			m_stats->total_tramp_space+=5;
@@ -1110,7 +1159,7 @@ int ZiprImpl_t::_DetermineWorstCaseInsnSize(Instruction_t* insn)
 	else
 		worst_case_size = DetermineWorstCaseInsnSize(insn);
 
-	if (m_opts.GetVerbose())
+	if (m_verbose)
 		cout << "Worst case size: " << worst_case_size << endl;
 
 	return worst_case_size;
@@ -1193,7 +1242,7 @@ void ZiprImpl_t::ProcessUnpinnedInstruction(const UnresolvedUnpinned_t &uu, cons
 	RangeAddress_t cur_addr=r.GetStart();
 	Instruction_t* cur_insn=uu.GetInstruction();
 
-	if(m_opts.GetVerbose())
+	if (m_verbose)
 		printf("Starting dollop with free range %p-%p\n", (void*)cur_addr, (void*)fr_end);
 
 
@@ -1216,9 +1265,10 @@ void ZiprImpl_t::ProcessUnpinnedInstruction(const UnresolvedUnpinned_t &uu, cons
 		//if (false)
 		if ((to_addr=final_insn_locations[cur_insn]) != 0)
 		{
-			if(m_opts.GetNoReplop())
+			//if(m_opts.GetNoReplop())
+			if (!m_replop)
 			{
-				if(m_opts.GetVerbose())
+				if (m_verbose)
 					printf("Fallthrough loop detected. "
 					"Emitting jump from %p to %p.\n",
 					(void*)cur_addr,
@@ -1232,19 +1282,19 @@ void ZiprImpl_t::ProcessUnpinnedInstruction(const UnresolvedUnpinned_t &uu, cons
 			}
 			else
 			{
-				if (m_opts.GetVerbose())
+				if (m_verbose)
 					printf("Fallthrough loop detected "
 					       "but we are replopping at "
 					       "user command.\n");
 			}
 		}
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Emitting %d:%s at %p until ",
 				id, 
 				d.CompleteInstr,
 				(void*)cur_addr);
 		cur_addr=_PlopInstruction(cur_insn,cur_addr);
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("%p\n", (void*)cur_addr);
 		cur_insn=cur_insn->GetFallthrough();
 		insn_count++;
@@ -1267,7 +1317,7 @@ void ZiprImpl_t::ProcessUnpinnedInstruction(const UnresolvedUnpinned_t &uu, cons
 	m_stats->total_dollop_instructions+=insn_count;
 	m_stats->total_dollop_space+=(cur_addr-fr_start);
 
-	if(m_opts.GetVerbose())
+	if (m_verbose)
 		printf("Ending dollop.  size=%d, %s.  space_remaining=%lld, req'd=%d\n", insn_count, truncated,
 		(long long)(fr_end-cur_addr), cur_insn ? _DetermineWorstCaseInsnSize(cur_insn) : -1 );
 }
@@ -1286,7 +1336,7 @@ void ZiprImpl_t::AskPluginsAboutPlopping()
 		{
 			ZiprPluginInterface_t *zipr_plopping_plugin =
 				dynamic_cast<ZiprPluginInterface_t*>(plopping_plugin);
-			if (m_opts.GetVerbose())
+			if (m_verbose)
 				cout << zipr_plopping_plugin->ToString()
 				     << " will plop this instruction!"
 						 << endl;
@@ -1311,7 +1361,7 @@ void ZiprImpl_t::PlopTheUnpinnedInstructions()
 		int id=uu.GetInstruction()->GetBaseID();
 		RangeAddress_t at=p.GetAddress();
 		
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Processing patch from %d:%s@%p\n",id,d.CompleteInstr,(void*)at);
 
 		// process the instruction.	
@@ -1359,7 +1409,7 @@ void ZiprImpl_t::ApplyPatches(Instruction_t* to_insn)
 		Patch_t p=mit->second;
 		RangeAddress_t from_addr=p.GetAddress();
 
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Found  a patch for  %p -> %p (%d:%s)\n", 
 			(void*)from_addr, (void*)to_addr, id,d.CompleteInstr);
 		// Patch instruction
@@ -1386,7 +1436,7 @@ void ZiprImpl_t::PatchInstruction(RangeAddress_t from_addr, Instruction_t* to_in
 	std::map<Instruction_t*,RangeAddress_t>::iterator it=final_insn_locations.find(to_insn);
 	if(it==final_insn_locations.end())
 	{
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Instruction cannot be patch yet, as target is unknown.\n");
 
 		patch_list.insert(pair<const  UnresolvedUnpinned_t,Patch_t>(uu,thepatch));
@@ -1395,7 +1445,7 @@ void ZiprImpl_t::PatchInstruction(RangeAddress_t from_addr, Instruction_t* to_in
 	{
 		RangeAddress_t to_addr=final_insn_locations[to_insn];
 		assert(to_addr!=0);
-		if(m_opts.GetVerbose())
+		if (m_verbose)
 			printf("Found a patch for %p -> %p\n", (void*)from_addr, (void*)to_addr); 
 		// Apply Patch
 		ApplyPatch(from_addr, to_addr);
@@ -1417,7 +1467,7 @@ RangeAddress_t ZiprImpl_t::_PlopInstruction(Instruction_t* insn,RangeAddress_t a
 		RangeAddress_t placed_address = 0;
 		ZiprPluginInterface_t *zpi = dynamic_cast<ZiprPluginInterface_t*>(handle);
 		updated_addr = zpi->PlopInstruction(insn, addr, placed_address, this);
-		if (m_opts.GetVerbose())
+		if (m_verbose)
 			cout << "Placed address: " << std::hex << placed_address << endl;
 		final_insn_locations[insn] = placed_address;
 	}
@@ -1695,7 +1745,7 @@ void ZiprImpl_t::FillSection(section* sec, FILE* fexe)
 	RangeAddress_t start=sec->get_address();
 	RangeAddress_t end=sec->get_size()+start;
 
-	if(m_opts.GetVerbose())
+	if (m_verbose)
 		printf("Dumping addrs %p-%p\n", (void*)start, (void*)end);
 	for(RangeAddress_t i=start;i<end;i++)
 	{
@@ -1708,7 +1758,7 @@ void ZiprImpl_t::FillSection(section* sec, FILE* fexe)
 			fwrite(&b,1,1,fexe);
 			if(i-start<200)// keep verbose output short enough.
 			{
-				if(m_opts.GetVerbose())
+				if (m_verbose)
 					printf("Writing byte %#2x at %p, fileoffset=%x\n", 
 						((unsigned)b)&0xff, (void*)i, file_off);
 			}
@@ -1801,7 +1851,7 @@ void ZiprImpl_t::OutputBinaryFile(const string &name)
 		}
 		if(i-start_of_new_space<200)// keep verbose output short enough.
 		{
-			if(m_opts.GetVerbose())
+			if (m_verbose)
 				printf("Writing byte %#2x at %p, fileoffset=%llx\n", ((unsigned)b)&0xff, 
 				(void*)i, (long long)(i-start_of_new_space));
 		}
@@ -1816,7 +1866,9 @@ void ZiprImpl_t::OutputBinaryFile(const string &name)
 
 void ZiprImpl_t::PrintStats()
 {
-	m_stats->PrintStats(m_opts, cout);
+	/* TODO:
+	*/
+	//m_stats->PrintStats(m_opts, cout);
 }
 
 template < typename T > std::string to_hex_string( const T& n )
@@ -1880,7 +1932,8 @@ void ZiprImpl_t::InsertNewSegmentIntoExe(string rewritten_file, string bin_to_ad
 	if(use_stratafier_mode)
 	{
 		string objcopy_cmd = "", stratafier_cmd = "", sstrip_cmd;
-		objcopy_cmd= m_opts.GetObjcopyPath() + string(" --add-section .strata=")+bin_to_add+" "+
+		//objcopy_cmd= m_opts.GetObjcopyPath() + string(" --add-section .strata=")+bin_to_add+" "+
+		objcopy_cmd= string(m_objcopy) + string(" --add-section .strata=")+bin_to_add+" "+
 			string("--change-section-address .strata=")+to_string(sec_start)+" "+
 			string("--set-section-flags .strata=alloc,code ")+" "+
 			// --set-start $textoffset // set-start not needed, as we aren't changing the entry point.
@@ -1901,7 +1954,8 @@ void ZiprImpl_t::InsertNewSegmentIntoExe(string rewritten_file, string bin_to_ad
 		stratafier_cmd="$STRATAFIER/move_segheaders";
 #endif
 
-		if (m_opts.GetArchitecture() == 64) {
+		//if (m_opts.GetArchitecture() == 64) {
+		if (m_architecture == 64) {
 			stratafier_cmd += "64";
 		}
 //		stratafier_cmd += " " + rewritten_file+ " " + rewritten_file +".addseg";
@@ -2012,7 +2066,8 @@ string ZiprImpl_t::AddCallbacksToNewSegment(const string& tmpname, RangeAddress_
 {
 	const RangeAddress_t callback_start_addr=GetCallbackStartAddr();
 
-	if(m_opts.GetCallbackFileName() == "" )
+	//if(m_opts.GetCallbackFileName() == "" )
+	if(m_callbacks == "" )
 		return tmpname;
 	string tmpname2=tmpname+"2";	
 	string tmpname3=tmpname+"3";	
@@ -2026,7 +2081,8 @@ string ZiprImpl_t::AddCallbacksToNewSegment(const string& tmpname, RangeAddress_
 		objcopy -O binary /home/jdh8d/umbrella/uvadev.peasoup/zipr_install/bin/callbacks.exe b.out.to_insert2
 	*/
 
-	string cmd= m_opts.GetObjcopyPath() + string(" -O binary ")+ m_opts.GetCallbackFileName()+string(" ")+tmpname2;
+	//string cmd= m_opts.GetObjcopyPath() + string(" -O binary ")+ m_opts.GetCallbackFileName()+string(" ")+tmpname2;
+	string cmd= string(m_objcopy) + string(" -O binary ")+string(m_callbacks)+string(" ")+tmpname2;
 #endif
 	printf("Attempting: %s\n", cmd.c_str());
 	if(-1 == system(cmd.c_str()))
@@ -2119,7 +2175,8 @@ RangeAddress_t ZiprImpl_t::FindCallbackAddress(RangeAddress_t end_of_new_space,
 	if(callback_addrs.find(callback)==callback_addrs.end())
 	{
 
-		RangeAddress_t addr=getSymbolAddress(m_opts.GetCallbackFileName(),callback);
+		//RangeAddress_t addr=getSymbolAddress(m_opts.GetCallbackFileName(),callback);
+		RangeAddress_t addr=getSymbolAddress(m_callbacks,callback);
 
 		if(addr!=0)
 		{
diff --git a/src/zipr_stats.cpp b/src/zipr_stats.cpp
index c0da8be..7714a00 100644
--- a/src/zipr_stats.cpp
+++ b/src/zipr_stats.cpp
@@ -51,7 +51,9 @@ void Stats_t::PrintStats(ZiprOptions_t &opts, std::ostream &out)
 	/*
 	 * Optimizations
 	 */
-	if(opts.IsEnabledOptimization(Optimizations_t::OptimizationFallthroughPinned))
+	//if(opts.IsEnabledOptimization(Optimizations_t::OptimizationFallthroughPinned))
+	// TODO
+	if (false)
 	{
 		PrintStat(out, "Optimization: FallthroughPinned hit rate",
 			(double)Hits[Optimizations_t::OptimizationFallthroughPinned]/
diff --git a/test/MemorySpace.cpp b/test/MemorySpace.cpp
index fe4395c..74c5023 100644
--- a/test/MemorySpace.cpp
+++ b/test/MemorySpace.cpp
@@ -38,9 +38,7 @@ printf(" fail\n"); \
 
 bool TestSplitMemorySpace()
 {
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 
 	m.AddFreeRange(Range_t(500, 600));
 
@@ -54,9 +52,7 @@ bool TestSplitMemorySpace()
 bool TestBinarySearchMaxRange()
 {
 	std::set<Range_t>::iterator foundRange;
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 	m.AddFreeRange(Range_t(256, (RangeAddress_t)-1));
 
 	m.SplitFreeRange(336);
@@ -79,9 +75,7 @@ bool TestBinarySearchMaxRange()
 bool TestBinarySearch()
 {
 	std::set<Range_t>::iterator foundRange;
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 	m.AddFreeRange(Range_t(256, 512));
 
 	m.SplitFreeRange(300);
@@ -144,9 +138,7 @@ bool TestBinarySearch()
 }
 bool TestSort()
 {
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 	m.AddFreeRange(Range_t(256, 512));
 
 	m.SplitFreeRange(300);
@@ -167,9 +159,7 @@ bool TestSort()
 
 bool TestInsertRemoveFreeRange()
 {
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 	m.AddFreeRange(Range_t(256, 512));
 	m.AddFreeRange(Range_t(513, 1024));
 	m.AddFreeRange(Range_t(1025, 4096));
@@ -188,9 +178,7 @@ bool TestInsertRemoveFreeRange()
 
 bool TestMergeFreeRange()
 {
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 	m.AddFreeRange(Range_t(256, 512));
 
 	m.SplitFreeRange(300);
@@ -238,9 +226,7 @@ bool TestMergeFreeRange()
 bool TestClearAllIteratively()
 {
 	Range_t removableRange;
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 
 	m.AddFreeRange(Range_t(256, 512));
 	m.AddFreeRange(Range_t(513, 1024));
@@ -260,9 +246,7 @@ bool TestClearAllIteratively()
 bool TestEraseOneByter()
 {
 	Range_t removableRange;
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 
 	m.AddFreeRange(Range_t(512, 512));
 	m.AddFreeRange(Range_t(256, 300));
@@ -274,9 +258,7 @@ bool TestEraseOneByter()
 bool TestClearSomeIteratively()
 {
 	Range_t removableRange;
-	ZiprOptions_t opts;
-	opts.SetVerbose(true);
-	ZiprMemorySpace_t m(&opts);
+	ZiprMemorySpace_t m;
 
 	m.AddFreeRange(Range_t(512, 512));
 	m.AddFreeRange(Range_t(513, 1024));
-- 
GitLab