From fff7ed8456a15c9b928b3cdd36d8ea13191fe182 Mon Sep 17 00:00:00 2001
From: clc5q <clc5q@git.zephyr-software.com>
Date: Thu, 28 Jan 2016 03:34:37 +0000
Subject: [PATCH] Fix problems with operand printing in annotations and
 PC-relative 64-bit operands.

Former-commit-id: e54c0844f92141025b820c2d7ea9bb6b2453307a
---
 include/base/SMPDataFlowAnalysis.h            |  6 +-
 src/base/SMPBasicBlock.cpp                    |  6 +-
 src/base/SMPDataFlowAnalysis.cpp              | 77 +++++++++++++------
 src/base/SMPFunction.cpp                      | 12 ++-
 src/base/SMPInstr.cpp                         | 27 +++++--
 ...save-ffmpeg.psexe.infoannot.REMOVED.git-id |  2 +-
 .../save-gimp.psexe.infoannot.REMOVED.git-id  |  2 +-
 .../save-gnome-keyring-daemon.psexe.infoannot |  2 +-
 tests/commit/save-nginx.psexe.infoannot       | 52 ++++++-------
 tests/commit/save-openssl.psexe.infoannot     | 50 ++++++------
 10 files changed, 142 insertions(+), 94 deletions(-)

diff --git a/include/base/SMPDataFlowAnalysis.h b/include/base/SMPDataFlowAnalysis.h
index 570c8a7d..83141b04 100644
--- a/include/base/SMPDataFlowAnalysis.h
+++ b/include/base/SMPDataFlowAnalysis.h
@@ -160,14 +160,14 @@ STARSOpndTypePtr CloneIfNecessary(const STARSOpndTypePtr &CurrOp, bool UseFP);
 // Debug: print one operand from an instruction or DEF or USE list.
 void PrintDefUse(unsigned long feature, int OpNum);
 void PrintSIB(const STARSOpndTypePtr &Opnd);
-void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile);
-void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, uint16_t SegReg, bool UseFP);
+void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, char OutString[STARS_MAXSTR], bool Has64BitOperands);
+void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, uint16_t SegReg, bool UseFP, bool Has64BitOperands);
 void PrintOneOperand(const STARSOpndTypePtr &Opnd, uint32_t features, int OpNum); 
 void PrintListOperand(const STARSOpndTypePtr &Opnd, int SSANum = SMP_SSA_UNINIT); 
 void PrintOperand(const STARSOpndTypePtr &Opnd);
 
 // Annotations: concisely print one operand.
-void AnnotPrintOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile);
+void AnnotPrintOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile, bool UseFP, bool Has64BitOperands);
 
 // Print opcode string.
 void PrintOpcode(uint16_t opcode, FILE *OutFile);
diff --git a/src/base/SMPBasicBlock.cpp b/src/base/SMPBasicBlock.cpp
index 372f1744..84e0736b 100644
--- a/src/base/SMPBasicBlock.cpp
+++ b/src/base/SMPBasicBlock.cpp
@@ -2290,8 +2290,10 @@ bool SMPBasicBlock::AnalyzeMemSet(STARS_ea_t MemSetAddr, STARSOpndTypePtr &MemSe
 					CanonicalizeOpnd(UseOp);
 				}
 				if (UseOp->IsVoidOp()) {
-					SMP_msg("ERROR: No move source at %lx within AnalyzeMemSet().\n",
-							(unsigned long) InstAddr);
+					// NOTE: We could drop the requirement for a move inst and trace arg #2
+					//  back through arithmetic if SCCP can find constants.
+					SMP_msg("WARNING: No move size at %llx within AnalyzeMemSet().\n",
+							(unsigned long long) InstAddr);
 					break;
 				}
 				else {
diff --git a/src/base/SMPDataFlowAnalysis.cpp b/src/base/SMPDataFlowAnalysis.cpp
index d9bb5760..4c84a84d 100644
--- a/src/base/SMPDataFlowAnalysis.cpp
+++ b/src/base/SMPDataFlowAnalysis.cpp
@@ -586,7 +586,8 @@ bool MDIsDirectStackAccessOpnd(const STARSOpndTypePtr &CurrOp, bool UseFP) {
 
 // MACHINE DEPENDENT: Is operand trackable in data flow analyses (i.e. a direct stack memory access or a register?)
 bool MDIsDataFlowOpnd(const STARSOpndTypePtr &CurrOp, bool UseFP) {
-	return ((nullptr != CurrOp) && (CurrOp->IsRegOp() || MDIsDirectStackAccessOpnd(CurrOp, UseFP)));
+	return ((nullptr != CurrOp) 
+		&& ((CurrOp->IsRegOp() && (STARS_x86_R_ip != CurrOp->GetReg())) || MDIsDirectStackAccessOpnd(CurrOp, UseFP)));
 }
 
 // MACHINE DEPENDENT: Is operand a caller-saved register?
@@ -694,26 +695,31 @@ void PrintSIB(const STARSOpndTypePtr &Opnd) {
 } // end PrintSIB()
 
 // Annotations: concisely print SIB info for an operand.
-void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile) {
+void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, char OutString[STARS_MAXSTR], bool Has64BitOperands) {
 	int BaseReg;
 	int IndexReg;
 	uint16_t ScaleFactor;
+	uint16_t ByteWidth = Opnd->GetByteWidth();
 	STARS_ea_t offset;
-	char OutString[STARS_MAXSTR] = {'[', '\0'};
 	char ScaleString[4];
 
+	if (Has64BitOperands)
+		ByteWidth = 8;
+
+	SMP_strncat(OutString, "[", STARS_MAXSTR - 1);
+
 	MDExtractAddressFields(Opnd, BaseReg, IndexReg, ScaleFactor, offset);
 
 	if (ScaleFactor > 0) {
-		ScaleFactor = 1 << (ScaleFactor - 1);
+		ScaleFactor = 1 << ScaleFactor;
 		(void) SMP_snprintf(ScaleString, 4, "%d", ScaleFactor);
 	}
 
 	if (BaseReg != STARS_x86_R_none) {
-		(void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, RegSizes[BaseReg]), STARS_MAXSTR - 1);
+		(void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, ByteWidth), STARS_MAXSTR - 1);
 		if (IndexReg != STARS_x86_R_none) {
 			(void) SMP_strncat(OutString, "+", STARS_MAXSTR-1);
-			(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), STARS_MAXSTR - 1);
+			(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, ByteWidth), STARS_MAXSTR - 1);
 			if (ScaleFactor > 0) {
 				(void) SMP_strncat(OutString, "*", STARS_MAXSTR-1);
 				(void) SMP_strncat(OutString, ScaleString, STARS_MAXSTR-1);
@@ -721,7 +727,7 @@ void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile)
 		}
 	}
 	else if (IndexReg != STARS_x86_R_none) {
-		(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), STARS_MAXSTR - 1);
+		(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, ByteWidth), STARS_MAXSTR - 1);
 		if (ScaleFactor > 0) {
 			(void) SMP_strncat(OutString, "*", STARS_MAXSTR-1);
 			(void) SMP_strncat(OutString, ScaleString, STARS_MAXSTR-1);
@@ -736,14 +742,18 @@ void AnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile)
 } // end AnnotPrintSIB()
 
 // Annotations: concisely print SIB info for an operand.
-void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, uint16_t SegReg, bool UseFP) {
+void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutFile, uint16_t SegReg, bool UseFP, bool Has64BitOperands) {
 	int BaseReg;
 	int IndexReg;
 	uint16_t ScaleFactor;
+	uint16_t ByteWidth = Opnd->GetByteWidth();
 	STARS_ea_t offset;
 	char OutString[STARS_MAXSTR] = {'(', '\0'};
 	char ScaleString[4];
 
+	if (Has64BitOperands)
+		ByteWidth = 8;
+
 	MDExtractAddressFields(Opnd, BaseReg, IndexReg, ScaleFactor, offset);
 
 	bool SegRegPrefix = STARS_x86_is_segreg((int) SegReg);
@@ -769,15 +779,15 @@ void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutF
 			(void) SMP_strncat(OutString, " + ", STARS_MAXSTR-1);
 		}
 		(void) SMP_strncat(OutString, "X86.", STARS_MAXSTR-1);
-		(void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, RegSizes[BaseReg]), STARS_MAXSTR-1);
-		if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[BaseReg]) {
+		(void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, ByteWidth), STARS_MAXSTR-1);
+		if (global_STARS_program->GetSTARS_ISA_Bytewidth() > ByteWidth) {
 			++SubwordAddressRegCount;
 		}
 		if (IndexReg != STARS_x86_R_none) {
 			(void) SMP_strncat(OutString, " + ", STARS_MAXSTR-1);
 			(void) SMP_strncat(OutString, "X86.", STARS_MAXSTR-1);
-			(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), STARS_MAXSTR-1);
-			if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[IndexReg]) {
+			(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, ByteWidth), STARS_MAXSTR-1);
+			if (global_STARS_program->GetSTARS_ISA_Bytewidth() > ByteWidth) {
 				++SubwordAddressRegCount;
 			}
 			if (ScaleFactor > 0) {
@@ -791,8 +801,8 @@ void SPARKAnnotPrintSIB(const STARSOpndTypePtr &Opnd, bool HasOffset, FILE *OutF
 			(void) SMP_strncat(OutString, " + ", STARS_MAXSTR-1);
 		}
 		(void) SMP_strncat(OutString, "X86.", STARS_MAXSTR-1);
-		(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), STARS_MAXSTR - 1);
-		if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[IndexReg]) {
+		(void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, ByteWidth), STARS_MAXSTR - 1);
+		if (global_STARS_program->GetSTARS_ISA_Bytewidth() > ByteWidth) {
 			++SubwordAddressRegCount;
 		}
 		if (ScaleFactor > 0) {
@@ -907,31 +917,52 @@ void PrintListOperand(const STARSOpndTypePtr &Opnd, int SSANum) {
 } // end of PrintListOperand()
 
 // Annotations: concisely print one operand.
-void AnnotPrintOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile) { 
+void AnnotPrintOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile, bool UseFP, bool Has64BitOperands) {
+	char OutString[STARS_MAXSTR] = { '\0', '\0' };
+	uint16_t ByteWidth = Opnd->GetByteWidth();
+	if (Has64BitOperands)
+		ByteWidth = 8;
+
+	uint16_t SegReg = Opnd->GetSegReg();
+	bool SegRegPrefix = STARS_x86_is_segreg((int) SegReg);
+	if (SegRegPrefix) {
+		// Emit segment register string unless it is just the stack segment plus a stack operand,
+		//  where the stack segment is implied anyway.
+		if ((SegReg == STARS_x86_R_ss) && MDIsStackAccessOpnd(Opnd, UseFP)) {
+			SegRegPrefix = false;
+		}
+		else if (SegReg != STARS_x86_R_ds) { // not default data segment 
+			(void) SMP_strncat(OutString, MDGetRegNumName(SegReg, RegSizes[SegReg]), STARS_MAXSTR - 1);
+			(void) SMP_strncat(OutString, ":", STARS_MAXSTR - 1);
+		}
+	}
 
 	if (Opnd->IsStaticMemOp()) {
-		SMP_fprintf(OutFile, " %llx", (unsigned long long) Opnd->GetAddr());
+		SMP_snprintf(OutString, STARS_MAXSTR - 1, " %llx", (unsigned long long) Opnd->GetAddr());
 		if (Opnd->HasSIBByte()) {
-			AnnotPrintSIB(Opnd, false, OutFile);
+			AnnotPrintSIB(Opnd, false, OutFile, OutString, Has64BitOperands);
+		}
+		else {
+			SMP_fprintf(OutFile, " %s", OutString);
 		}
 	}
 	else if (Opnd->IsMemNoDisplacementOp()) {
 		if (Opnd->HasSIBByte()) { // has SIB info
-			AnnotPrintSIB(Opnd, false, OutFile);
+			AnnotPrintSIB(Opnd, false, OutFile, OutString, Has64BitOperands);
 		}
 		else { // no SIB info
 			uint16_t BaseReg = Opnd->GetReg();
-			SMP_fprintf(OutFile, " [%s]", MDGetRegNumName(BaseReg, RegSizes[BaseReg]));
+			SMP_fprintf(OutFile, " [%s]", MDGetRegNumName(BaseReg, ByteWidth));
 		}
 		if (Opnd->GetAddr() != 0) {
-			SMP_msg(" \n ERROR: addr for o_phrase type: %lx\n", (unsigned long) Opnd->GetAddr());
+			SMP_msg(" \n ERROR: addr for o_phrase type: %llx\n", (unsigned long long) Opnd->GetAddr());
 		}
 	}
 	else if (Opnd->IsMemDisplacementOp()) {
 		STARS_ea_t offset = Opnd->GetAddr();
 		int SignedOffset = (int) offset;
 		if (Opnd->HasSIBByte()) {
-			AnnotPrintSIB(Opnd, (SignedOffset != 0), OutFile);
+			AnnotPrintSIB(Opnd, (SignedOffset != 0), OutFile, OutString, Has64BitOperands);
 			if (SignedOffset > 0) // print plus sign
 				SMP_fprintf(OutFile, "+%d]", SignedOffset);
 			else if (SignedOffset < 0) // minus sign will print automatically
@@ -941,9 +972,9 @@ void AnnotPrintOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile) {
 		else {
 			uint16_t BaseReg = Opnd->GetReg();
 			if (SignedOffset >= 0) // print plus sign
-				SMP_fprintf(OutFile, " [%s+%d]", MDGetRegNumName(BaseReg, RegSizes[BaseReg]), SignedOffset);
+				SMP_fprintf(OutFile, " [%s+%d]", MDGetRegNumName(BaseReg, ByteWidth), SignedOffset);
 			else // minus sign will print automatically
-				SMP_fprintf(OutFile, " [%s%d]", MDGetRegNumName(BaseReg, RegSizes[BaseReg]), SignedOffset);
+				SMP_fprintf(OutFile, " [%s%d]", MDGetRegNumName(BaseReg, ByteWidth), SignedOffset);
 		}
 	}
 	else if (Opnd->IsRegOp()) {
diff --git a/src/base/SMPFunction.cpp b/src/base/SMPFunction.cpp
index d34e4f46..9e5e6265 100644
--- a/src/base/SMPFunction.cpp
+++ b/src/base/SMPFunction.cpp
@@ -5499,6 +5499,10 @@ void SMPFunction::DetectLoopInvariantDEFs(void) {
 							VariantUseFound = true;
 							break;
 						}
+						else if (UseOp->GetReg() == STARS_x86_R_ip) { // instruction pointer a.k.a. program counter
+							VariantUseFound = true;
+							break;
+						}
 						else if (UseOp->IsRegOp()) {
 							// Find out if reg DEF is in a Phi function for the loop header, or otherwise outside the loop.
 							bool LocalName = CurrBlock->IsLocalName(UseOp);
@@ -9764,14 +9768,14 @@ void SMPFunction::EmitFuncPtrShadowingAnnotations(FILE *InfoAnnotFile) {
 								// Emit the annotation to shadow the InArg value at the top of the function.
 								SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR FPTRSHADOW ",
 									(unsigned long long) ShadowAddr, ShadowInst->GetSize());
-								AnnotPrintOperand(ShadowOp, InfoAnnotFile);
+								AnnotPrintOperand(ShadowOp, InfoAnnotFile, UseFP, ShadowInst->MDHas64BitOperands());
 								SMP_fprintf(InfoAnnotFile, " SHADOWID %u\n", CurrentShadowID);
 
 								// Emit the annotation to check the shadowed value before the INDIR_CALL.
 								SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR FPTRCHECK ",
 									(unsigned long long) ShadowCheckAddr, CurrInst->GetSize());
 								UseOp = CurrInst->GetFirstRightOperandNoNorm(); // for annotation printing
-								AnnotPrintOperand(UseOp, InfoAnnotFile);
+								AnnotPrintOperand(UseOp, InfoAnnotFile, UseFP, CurrInst->MDHas64BitOperands());
 								SMP_fprintf(InfoAnnotFile, " SHADOWID %u\n", CurrentShadowID);
 
 								// Increment the unique shadowing index
@@ -9803,7 +9807,7 @@ void SMPFunction::EmitFuncPtrShadowingAnnotations(FILE *InfoAnnotFile) {
 										// Emit the annotation to shadow the InArg value at the top of the function.
 										SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR FPTRSHADOW ",
 											(unsigned long long) ShadowAddr, ShadowInst->GetSize());
-										AnnotPrintOperand(ShadowOp, InfoAnnotFile);
+										AnnotPrintOperand(ShadowOp, InfoAnnotFile, UseFP, ShadowInst->MDHas64BitOperands());
 										SMP_fprintf(InfoAnnotFile, " SHADOWID %u\n", CurrentShadowID);
 
 										// Emit the annotation to check the shadowed value before the INDIR_CALL.
@@ -9814,7 +9818,7 @@ void SMPFunction::EmitFuncPtrShadowingAnnotations(FILE *InfoAnnotFile) {
 											ArgOp = CurrInst->GetFirstLeftOperandNoNorm();
 												// need unnormalized stack mem ops for annotations
 										}
-										AnnotPrintOperand(ArgOp, InfoAnnotFile);
+										AnnotPrintOperand(ArgOp, InfoAnnotFile, UseFP, CurrInst->MDHas64BitOperands());
 										SMP_fprintf(InfoAnnotFile, " SHADOWID %u\n", CurrentShadowID);
 
 										// Increment the unique shadowing index
diff --git a/src/base/SMPInstr.cpp b/src/base/SMPInstr.cpp
index 9936e18c..372dbe35 100644
--- a/src/base/SMPInstr.cpp
+++ b/src/base/SMPInstr.cpp
@@ -353,7 +353,7 @@ void SMPInstr::PrintSPARKAdaOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile,
 	if (Opnd->IsStaticMemOp()) {
 		if (Opnd->HasSIBByte()) {
 			SMP_fprintf(OutFile, " %s ", MemWriteString);
-			SPARKAnnotPrintSIB(Opnd, true, OutFile, Opnd->GetSegReg(), UseFP);
+			SPARKAnnotPrintSIB(Opnd, true, OutFile, Opnd->GetSegReg(), UseFP, this->MDHas64BitOperands());
 			SMP_fprintf(OutFile, " + 16#%llx# )", (unsigned long long) Opnd->GetAddr());
 		}
 		else {
@@ -366,7 +366,7 @@ void SMPInstr::PrintSPARKAdaOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile,
 	else if (Opnd->IsMemNoDisplacementOp()) {
 		if (Opnd->HasSIBByte()) { // has SIB info
 			SMP_fprintf(OutFile, " %s ", MemWriteString);
-			SPARKAnnotPrintSIB(Opnd, false, OutFile, Opnd->GetSegReg(), UseFP);
+			SPARKAnnotPrintSIB(Opnd, false, OutFile, Opnd->GetSegReg(), UseFP, this->MDHas64BitOperands());
 		}
 		else { // no SIB info
 			uint16_t BaseReg = Opnd->GetReg();
@@ -398,7 +398,7 @@ void SMPInstr::PrintSPARKAdaOperand(const STARSOpndTypePtr &Opnd, FILE *OutFile,
 		int SignedOffset = (int) offset;
 		if (Opnd->HasSIBByte()) {
 			SMP_fprintf(OutFile, " %s ", MemWriteString);
-			SPARKAnnotPrintSIB(Opnd, (SignedOffset != 0), OutFile, Opnd->GetSegReg(), UseFP);
+			SPARKAnnotPrintSIB(Opnd, (SignedOffset != 0), OutFile, Opnd->GetSegReg(), UseFP, this->MDHas64BitOperands());
 			if (SignedOffset > 0) // print plus sign
 				SMP_fprintf(OutFile, "+%d )", SignedOffset);
 			else if (SignedOffset < 0) // minus sign will print automatically
@@ -8337,8 +8337,12 @@ void SMPInstr::SCCPFetchConstUseValue(const STARSOpndTypePtr &UseOp, STARS_SCCP_
 			BaseReg = UseOp->MDGetSIBIndexReg();
 			if (MD_STACK_POINTER_REG == BaseReg) {
 				// ESP IndexReg in SIB byte means no index reg
+				// seg reg without index or base reg, e.g.:  FS:0x28
 				BaseReg = STARS_x86_R_none;
+				GoodAddr = false; // until we track segment register values
+#if 0	
 				SMP_msg("ERROR: StaticMemOp with SIB byte and no index reg at %llx\n", (unsigned long long) this->GetAddr());
+#endif
 			}
 		}
 #else
@@ -11102,7 +11106,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE
 		// Need to unnormalize stack memory DEFs and USEs before printing annotations.
 		this->MDGetUnnormalizedOp(AnnotDefOp);
 		SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR MEMSRC %d", (unsigned long long) addr, this->GetSize(), SrcBitWidth);
-		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile);
+		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile, UseFP, this->MDHas64BitOperands());
 		SMP_fprintf(InfoAnnotFile, " ZZ %s \n", disasm);
 	}
 	if (MemDest) {
@@ -11112,7 +11116,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE
 		// Need to unnormalize stack memory DEFs and USEs before printing annotations.
 		this->MDGetUnnormalizedOp(AnnotDefOp);
 		SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR MEMDEF %d", (unsigned long long) addr, this->GetSize(), DestBitWidth);
-		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile);
+		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile, UseFP, this->MDHas64BitOperands());
 		SMP_fprintf(InfoAnnotFile, " ZZ %s \n", disasm);
 	}
 #endif
@@ -11388,7 +11392,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame,
 		// Need to unnormalize stack memory DEFs and USEs before printing annotations.
 		this->MDGetUnnormalizedOp(AnnotDefOp);
 		SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR MEMSRC %zu", (unsigned long long) addr, this->GetSize(), SrcBitWidth);
-		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile);
+		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile, UseFP, this->MDHas64BitOperands());
 		SMP_fprintf(InfoAnnotFile, " ZZ %s \n", disasm);
 	}
 	if (MemDest) {
@@ -11398,7 +11402,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame,
 		// Need to unnormalize stack memory DEFs and USEs before printing annotations.
 		this->MDGetUnnormalizedOp(AnnotDefOp);
 		SMP_fprintf(InfoAnnotFile, "%18llx %6zu INSTR MEMDEF %zu", (unsigned long long) addr, this->GetSize(), DestBitWidth);
-		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile);
+		AnnotPrintOperand(AnnotDefOp, InfoAnnotFile, UseFP, this->MDHas64BitOperands());
 		SMP_fprintf(InfoAnnotFile, " ZZ %s \n", disasm);
 	}
 #endif
@@ -12002,7 +12006,7 @@ void SMPInstr::EmitIntegerErrorAnnotations(FILE *InfoAnnotFile, list<std::size_t
 					// Need to unnormalize stack memory DEFs and USEs before printing annotations.
 					this->MDGetUnnormalizedOp(AnnotDefOp);
 				}
-				AnnotPrintOperand(AnnotDefOp, InfoAnnotFile);
+				AnnotPrintOperand(AnnotDefOp, InfoAnnotFile, UseFP, this->MDHas64BitOperands());
 				if (!IgnoreOverflow) {
 					// See if we made a special detection of an operation involved in a hash function, which can
 					//  be expected to overflow benignly.
@@ -14164,6 +14168,13 @@ bool SMPInstr::BuildLeaRTL(void) {
 					SourceFound = true;
 					UseOp = TempOp;
 					MDExtractAddressFields(TempOp, BaseReg, IndexReg, ScaleFactor, offset);
+					if (TempOp->GetSegReg() == STARS_x86_R_cs) {
+						// Special case of PC-relative addressing, e.g. lea edx,[eip+offset]
+						//  which is encoded by IDA Pro with no basereg but CS segreg.
+						if (STARS_x86_R_none == BaseReg) {
+							BaseReg = STARS_x86_R_ip;
+						}
+					}
 				}
 				else {
 					;
diff --git a/tests/commit/save-ffmpeg.psexe.infoannot.REMOVED.git-id b/tests/commit/save-ffmpeg.psexe.infoannot.REMOVED.git-id
index 5b9eb318..48c6afbe 100644
--- a/tests/commit/save-ffmpeg.psexe.infoannot.REMOVED.git-id
+++ b/tests/commit/save-ffmpeg.psexe.infoannot.REMOVED.git-id
@@ -1 +1 @@
-17a6bfb9aafc8e86bff8064b686f3bc98bf8301a
\ No newline at end of file
+8bc3eb7b422e0fad165848585f9251bfd0f8d062
\ No newline at end of file
diff --git a/tests/commit/save-gimp.psexe.infoannot.REMOVED.git-id b/tests/commit/save-gimp.psexe.infoannot.REMOVED.git-id
index 6912d797..ed49a650 100644
--- a/tests/commit/save-gimp.psexe.infoannot.REMOVED.git-id
+++ b/tests/commit/save-gimp.psexe.infoannot.REMOVED.git-id
@@ -1 +1 @@
-87c871085d7c0c035f6af3bc7851f7b00d99de9d
\ No newline at end of file
+19633d3dd00a963df7f2b6cfc39ea5a286e2aad5
\ No newline at end of file
diff --git a/tests/commit/save-gnome-keyring-daemon.psexe.infoannot b/tests/commit/save-gnome-keyring-daemon.psexe.infoannot
index 07f91e5c..30260469 100644
--- a/tests/commit/save-gnome-keyring-daemon.psexe.infoannot
+++ b/tests/commit/save-gnome-keyring-daemon.psexe.infoannot
@@ -1787,7 +1787,7 @@
             422c50    118 FUNC RETURNTYPE RAX 4
             422c50    118 FUNC INARGS    6  ARG0 4 ARG1 16 ARG2 4 ARG3 1 ARG4 1 ARG5 0 
             422c50    118 FUNC PROBLEM sub_422C50 CALLUNRESOLVED 
-            422c5d      4 INSTR FPTRSHADOW  [EDI+16] SHADOWID 1
+            422c5d      4 INSTR FPTRSHADOW  [RDI+16] SHADOWID 1
             422c72      2 INSTR FPTRCHECK  RAX SHADOWID 1
             422cd0     59 FUNC RETURNTYPE RAX 0
             422cd0     59 FUNC INARGS    6  ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
diff --git a/tests/commit/save-nginx.psexe.infoannot b/tests/commit/save-nginx.psexe.infoannot
index 3f5d7768..15d41db6 100644
--- a/tests/commit/save-nginx.psexe.infoannot
+++ b/tests/commit/save-nginx.psexe.infoannot
@@ -4229,7 +4229,7 @@
             468fc9      4 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 RBX+4 ZZ lea     rsi, [len+4]    ; size 
             4692cd      4 INSTR CHECK OVERFLOW UNSIGNED 64  RDI ZZ IDIOM 18 MEMORYSINK add     rdi, 2          ; dest 
             4690a8      3 INSTR FPTRSHADOW  RAX SHADOWID 4
-            469155      2 INSTR FPTRCHECK  [EAX] SHADOWID 4
+            469155      2 INSTR FPTRCHECK  [RAX] SHADOWID 4
             469453   3920 FUNC RETURNTYPE RAX 1
             469453   3920 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 0 ARG4 0 ARG5 0 
             46980a      7 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 RBX+192 ZZ IDIOM 18 MEMORYSINK lea     rsi, [conf+0C0h]; path 
@@ -5442,7 +5442,7 @@
             485630    284 FUNC RETURNTYPE RAX 1
             485630    284 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 96 ARG3 96 ARG4 96 ARG5 96 
             485630    284 FUNC PROBLEM SSL_srp_server_param_with_username CALLUNRESOLVED 
-            485659      7 INSTR FPTRSHADOW  [EDI+688] SHADOWID 6
+            485659      7 INSTR FPTRSHADOW  [RDI+688] SHADOWID 6
             485672      2 INSTR FPTRCHECK  RAX SHADOWID 6
             485750    231 FUNC RETURNTYPE RAX 1
             485750    231 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 4 ARG4 4 ARG5 4 
@@ -5602,9 +5602,9 @@
             489474      5 INSTR CHECK OVERFLOW NOFLAGUNKNOWNSIGN 64 R13+RDX+20 ZZ IDIOM 18 MEMORYSINK lea     rsi, [r13+rdx+14h] 
             4894e3      4 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R13+8 ZZ IDIOM 18 MEMORYSINK lea     rsi, [r13+8]    ; src 
             4894e7      2 INSTR CHECK SIGNEDNESS UNSIGNED 32 ECX ZZ mov     edx, ecx        ; n 
-            489065      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 7
+            489065      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 7
             48908f      2 INSTR FPTRCHECK  RAX SHADOWID 7
-            48827c      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 8
+            48827c      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 8
             4882a9      3 INSTR FPTRCHECK  R10 SHADOWID 8
             489900      6 FUNC RETURNTYPE RAX 1
             489900      6 FUNC INARGS    6  ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -6058,9 +6058,9 @@
             49b735      7 INSTR CHECK OVERFLOW UNSIGNED 64  RSI ZZ IDIOM 18 MEMORYSINK add     rsi, [rbp+130h] ; src 
             49b73c      3 INSTR CHECK SIGNEDNESS UNSIGNED 64 R12 ZZ mov     edx, r12d       ; n 
             49b911      8 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R12+1000 ZZ IDIOM 32 lea     edx, [r12+3E8h] 
-            49aac8      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 9
+            49aac8      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 9
             49ab11      2 INSTR FPTRCHECK  RAX SHADOWID 9
-            49b4b1      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 10
+            49b4b1      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 10
             49b4e4      2 INSTR FPTRCHECK  RAX SHADOWID 10
             49bae0    287 FUNC RETURNTYPE RAX 96
             49bae0    287 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 4 
@@ -6110,7 +6110,7 @@
             49c650   1038 FUNC PROBLEM ssl3_get_message CALLUNRESOLVED 
             49c771      3 INSTR CHECK OVERFLOW SIGNED 32  RDX ZZ add     edx, 4 
             49c96b      3 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 RCX+4 ZZ lea     esi, [rcx+4] 
-            49c830      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 11
+            49c830      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 11
             49c7ec      2 INSTR FPTRCHECK  RAX SHADOWID 11
             49ca60    157 FUNC RETURNTYPE RAX 1
             49ca60    157 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 96 ARG3 96 ARG4 96 ARG5 96 
@@ -6318,9 +6318,9 @@
             4a2a2b      7 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 RCX+632 ZZ IDIOM 18 MEMORYSINK lea     rsi, [rcx+278h] 
             4a3236      7 INSTR CHECK OVERFLOW UNSIGNED 64  RSI ZZ IDIOM 18 MEMORYSINK add     rsi, [r13+130h] ; src 
             4a32b9      8 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R12+1000 ZZ IDIOM 32 lea     edx, [r12+3E8h] 
-            4a2add      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 12
+            4a2add      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 12
             4a2b27      2 INSTR FPTRCHECK  RAX SHADOWID 12
-            4a3003      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 13
+            4a3003      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 13
             4a3035      2 INSTR FPTRCHECK  RAX SHADOWID 13
             4a3500    238 FUNC RETURNTYPE RAX 1
             4a3500    238 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -7362,7 +7362,7 @@
             4bbf20     79 FUNC RETURNTYPE RAX 1
             4bbf20     79 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4bbf20     79 FUNC PROBLEM RSA_set_method CALLUNRESOLVED 
-            4bbf51      4 INSTR FPTRSHADOW  [EBP+56] SHADOWID 14
+            4bbf51      4 INSTR FPTRSHADOW  [RBP+56] SHADOWID 14
             4bbf61      2 INSTR FPTRCHECK  RAX SHADOWID 14
             4bbf70    587 FUNC RETURNTYPE RAX 4
             4bbf70    587 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 1 ARG5 0 
@@ -7539,7 +7539,7 @@
             4be450     91 FUNC RETURNTYPE RAX 1
             4be450     91 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4be450     91 FUNC PROBLEM DH_set_method CALLUNRESOLVED 
-            4be48a      4 INSTR FPTRSHADOW  [EBP+32] SHADOWID 15
+            4be48a      4 INSTR FPTRSHADOW  [RBP+32] SHADOWID 15
             4be49d      2 INSTR FPTRCHECK  RAX SHADOWID 15
             4be4b0    440 FUNC RETURNTYPE RAX 4
             4be4b0    440 FUNC INARGS    6  ARG0 0 ARG1 0 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
@@ -9290,42 +9290,42 @@
             4d6c60    110 FUNC RETURNTYPE RAX 1
             4d6c60    110 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 0 ARG3 1 ARG4 96 ARG5 1 
             4d6c60    110 FUNC PROBLEM EVP_PKEY_sign_init CALLUNRESOLVED 
-            4d6c78      4 INSTR FPTRSHADOW  [EAX+64] SHADOWID 17
+            4d6c78      4 INSTR FPTRSHADOW  [RAX+64] SHADOWID 17
             4d6c8d      2 INSTR FPTRCHECK  RDX SHADOWID 17
             4d6cd0    294 FUNC RETURNTYPE RAX 0
             4d6cd0    294 FUNC PROBLEM EVP_PKEY_sign JUMPUNRESOLVED 
             4d6e00    110 FUNC RETURNTYPE RAX 1
             4d6e00    110 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 0 ARG3 1 ARG4 96 ARG5 1 
             4d6e00    110 FUNC PROBLEM EVP_PKEY_verify_init CALLUNRESOLVED 
-            4d6e18      4 INSTR FPTRSHADOW  [EAX+80] SHADOWID 18
+            4d6e18      4 INSTR FPTRSHADOW  [RAX+80] SHADOWID 18
             4d6e2d      2 INSTR FPTRCHECK  RDX SHADOWID 18
             4d6e70    134 FUNC RETURNTYPE RAX 0
             4d6e70    134 FUNC PROBLEM EVP_PKEY_verify JUMPUNRESOLVED 
             4d6f00    110 FUNC RETURNTYPE RAX 1
             4d6f00    110 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4d6f00    110 FUNC PROBLEM EVP_PKEY_verify_recover_init CALLUNRESOLVED 
-            4d6f18      4 INSTR FPTRSHADOW  [EAX+96] SHADOWID 19
+            4d6f18      4 INSTR FPTRSHADOW  [RAX+96] SHADOWID 19
             4d6f2d      2 INSTR FPTRCHECK  RDX SHADOWID 19
             4d6f70    294 FUNC RETURNTYPE RAX 0
             4d6f70    294 FUNC PROBLEM EVP_PKEY_verify_recover JUMPUNRESOLVED 
             4d70a0    126 FUNC RETURNTYPE RAX 1
             4d70a0    126 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 4 ARG5 1 
             4d70a0    126 FUNC PROBLEM EVP_PKEY_encrypt_init CALLUNRESOLVED 
-            4d70bb      7 INSTR FPTRSHADOW  [EAX+144] SHADOWID 20
+            4d70bb      7 INSTR FPTRSHADOW  [RAX+144] SHADOWID 20
             4d70d3      2 INSTR FPTRCHECK  RDX SHADOWID 20
             4d7120    294 FUNC RETURNTYPE RAX 0
             4d7120    294 FUNC PROBLEM EVP_PKEY_encrypt JUMPUNRESOLVED 
             4d7250    126 FUNC RETURNTYPE RAX 1
             4d7250    126 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 4 ARG5 1 
             4d7250    126 FUNC PROBLEM EVP_PKEY_decrypt_init CALLUNRESOLVED 
-            4d726b      7 INSTR FPTRSHADOW  [EAX+160] SHADOWID 21
+            4d726b      7 INSTR FPTRSHADOW  [RAX+160] SHADOWID 21
             4d7283      2 INSTR FPTRCHECK  RDX SHADOWID 21
             4d72d0    294 FUNC RETURNTYPE RAX 0
             4d72d0    294 FUNC PROBLEM EVP_PKEY_decrypt JUMPUNRESOLVED 
             4d7400    126 FUNC RETURNTYPE RAX 1
             4d7400    126 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4d7400    126 FUNC PROBLEM EVP_PKEY_derive_init CALLUNRESOLVED 
-            4d741b      7 INSTR FPTRSHADOW  [EAX+176] SHADOWID 22
+            4d741b      7 INSTR FPTRSHADOW  [RAX+176] SHADOWID 22
             4d7433      2 INSTR FPTRCHECK  RDX SHADOWID 22
             4d7480    562 FUNC RETURNTYPE RAX 1
             4d7480    562 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 96 ARG5 96 
@@ -9338,7 +9338,7 @@
             4d7800    110 FUNC RETURNTYPE RAX 1
             4d7800    110 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4d7800    110 FUNC PROBLEM EVP_PKEY_paramgen_init CALLUNRESOLVED 
-            4d7818      4 INSTR FPTRSHADOW  [EAX+32] SHADOWID 23
+            4d7818      4 INSTR FPTRSHADOW  [RAX+32] SHADOWID 23
             4d782d      2 INSTR FPTRCHECK  RDX SHADOWID 23
             4d7870    259 FUNC RETURNTYPE RAX 1
             4d7870    259 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -9346,7 +9346,7 @@
             4d7980    110 FUNC RETURNTYPE RAX 1
             4d7980    110 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4d7980    110 FUNC PROBLEM EVP_PKEY_keygen_init CALLUNRESOLVED 
-            4d7998      4 INSTR FPTRSHADOW  [EAX+48] SHADOWID 24
+            4d7998      4 INSTR FPTRSHADOW  [RAX+48] SHADOWID 24
             4d79ad      2 INSTR FPTRCHECK  RDX SHADOWID 24
             4d79f0    259 FUNC RETURNTYPE RAX 1
             4d79f0    259 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
@@ -9362,7 +9362,7 @@
             4d7b70    225 FUNC RETURNTYPE RAX 1
             4d7b70    225 FUNC INARGS    6  ARG0 1 ARG1 1 ARG2 4 ARG3 0 ARG4 96 ARG5 96 
             4d7b70    225 FUNC PROBLEM EVP_PKEY_new_mac_key CALLUNRESOLVED 
-            4d7bb3      4 INSTR FPTRSHADOW  [EAX+48] SHADOWID 25
+            4d7bb3      4 INSTR FPTRSHADOW  [RAX+48] SHADOWID 25
             4d7bc6      2 INSTR FPTRCHECK  RAX SHADOWID 25
             4d7c60    454 FUNC RETURNTYPE RAX 1
             4d7c60    454 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 1 ARG4 96 ARG5 1 
@@ -11864,7 +11864,7 @@
             5014e0    270 FUNC RETURNTYPE RAX 96
             5014e0    270 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             5014e0    270 FUNC PROBLEM COMP_CTX_new CALLUNRESOLVED 
-            501542      4 INSTR FPTRSHADOW  [EBX+16] SHADOWID 26
+            501542      4 INSTR FPTRSHADOW  [RBX+16] SHADOWID 26
             501552      2 INSTR FPTRCHECK  RAX SHADOWID 26
             5015f0     34 FUNC RETURNTYPE RAX 96
             5015f0     34 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 4 ARG3 1 ARG4 4 ARG5 96 
@@ -12577,11 +12577,11 @@
             5221f0    496 FUNC PROBLEM CRYPTO_gcm128_setiv CALLUNRESOLVED 
             522285      4 INSTR CHECK UNDERFLOW UNSIGNED 64  R13 ZZ IDIOM 31 sub     r13, 10h 
             522358      4 INSTR CHECK OVERFLOW UNSIGNED 64  RAX ZZ add     rax, 1 
-            522208      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 27
+            522208      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 27
             52231c      3 INSTR FPTRCHECK  R14 SHADOWID 27
-            522208      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 28
+            522208      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 28
             522367      3 INSTR FPTRCHECK  R14 SHADOWID 28
-            522208      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 29
+            522208      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 29
             522380      3 INSTR FPTRCHECK  R14 SHADOWID 29
             5223e0    411 FUNC RETURNTYPE RAX 1
             5223e0    411 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 1 ARG3 0 ARG4 96 ARG5 96 
@@ -13507,7 +13507,7 @@
             540520     85 FUNC RETURNTYPE RAX 1
             540520     85 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             540520     85 FUNC PROBLEM DSA_set_method CALLUNRESOLVED 
-            540557      4 INSTR FPTRSHADOW  [EBP+48] SHADOWID 31
+            540557      4 INSTR FPTRSHADOW  [RBP+48] SHADOWID 31
             540567      2 INSTR FPTRCHECK  RAX SHADOWID 31
             540580    518 FUNC RETURNTYPE RAX 4
             540580    518 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 1 ARG5 0 
@@ -13769,7 +13769,7 @@
             5458c0    450 FUNC RETURNTYPE RAX 96
             5458c0    450 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 96 ARG4 96 ARG5 4 
             5458c0    450 FUNC PROBLEM DSO_new_method CALLUNRESOLVED 
-            545958      4 INSTR FPTRSHADOW  [EBP+64] SHADOWID 32
+            545958      4 INSTR FPTRSHADOW  [RBP+64] SHADOWID 32
             545967      2 INSTR FPTRCHECK  RAX SHADOWID 32
             545a90      7 FUNC RETURNTYPE RAX 4
             545a90      7 FUNC INARGS    6  ARG0 0 ARG1 4 ARG2 0 ARG3 4 ARG4 0 ARG5 4 
diff --git a/tests/commit/save-openssl.psexe.infoannot b/tests/commit/save-openssl.psexe.infoannot
index 6466a662..eba7330c 100644
--- a/tests/commit/save-openssl.psexe.infoannot
+++ b/tests/commit/save-openssl.psexe.infoannot
@@ -1078,9 +1078,9 @@
             4509e4      5 INSTR CHECK OVERFLOW NOFLAGUNKNOWNSIGN 64 R13+RDX+20 ZZ IDIOM 18 MEMORYSINK lea     rsi, [r13+rdx+14h] 
             450a53      4 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R13+8 ZZ IDIOM 18 MEMORYSINK lea     rsi, [r13+8]    ; src 
             450a57      2 INSTR CHECK SIGNEDNESS UNSIGNED 32 ECX ZZ mov     edx, ecx        ; n 
-            4505d5      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 1
+            4505d5      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 1
             4505ff      2 INSTR FPTRCHECK  RAX SHADOWID 1
-            44f7ec      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 2
+            44f7ec      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 2
             44f819      3 INSTR FPTRCHECK  R10 SHADOWID 2
             450e70      6 FUNC RETURNTYPE RAX 1
             450e70      6 FUNC INARGS    6  ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -1530,9 +1530,9 @@
             462c35      7 INSTR CHECK OVERFLOW UNSIGNED 64  RSI ZZ IDIOM 18 MEMORYSINK add     rsi, [rbp+130h] ; src 
             462c3c      3 INSTR CHECK SIGNEDNESS UNSIGNED 64 R12 ZZ mov     edx, r12d       ; n 
             462df1      8 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R12+1000 ZZ IDIOM 32 lea     edx, [r12+3E8h] 
-            461fc8      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 3
+            461fc8      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 3
             462011      2 INSTR FPTRCHECK  RAX SHADOWID 3
-            4629b1      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 4
+            4629b1      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 4
             4629e4      2 INSTR FPTRCHECK  RAX SHADOWID 4
             462fc0    287 FUNC RETURNTYPE RAX 96
             462fc0    287 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -1583,7 +1583,7 @@
             463b10   1030 FUNC PROBLEM ssl3_get_message CALLUNRESOLVED 
             463c31      3 INSTR CHECK OVERFLOW SIGNED 32  RDX ZZ add     edx, 4 
             463e23      3 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 RCX+4 ZZ lea     esi, [rcx+4] 
-            463cf0      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 5
+            463cf0      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 5
             463cac      2 INSTR FPTRCHECK  RAX SHADOWID 5
             463f20    157 FUNC RETURNTYPE RAX 1
             463f20    157 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 96 ARG3 96 ARG4 96 ARG5 96 
@@ -2033,9 +2033,9 @@
             473012      8 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R12+632 ZZ IDIOM 18 MEMORYSINK lea     rsi, [r12+278h] 
             473876      7 INSTR CHECK OVERFLOW UNSIGNED 64  RSI ZZ IDIOM 18 MEMORYSINK add     rsi, [r13+130h] ; src 
             473996      8 INSTR CHECK OVERFLOW NOFLAGUNSIGNED 64 R12+1000 ZZ IDIOM 32 lea     edx, [r12+3E8h] 
-            4730b5      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 6
+            4730b5      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 6
             4730ff      2 INSTR FPTRCHECK  RAX SHADOWID 6
-            473643      7 INSTR FPTRSHADOW  [EBX+152] SHADOWID 7
+            473643      7 INSTR FPTRSHADOW  [RBX+152] SHADOWID 7
             473675      2 INSTR FPTRCHECK  RAX SHADOWID 7
             473b40    238 FUNC RETURNTYPE RAX 1
             473b40    238 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
@@ -2940,7 +2940,7 @@
             488750    284 FUNC RETURNTYPE RAX 1
             488750    284 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 96 ARG3 96 ARG4 96 ARG5 96 
             488750    284 FUNC PROBLEM SSL_srp_server_param_with_username CALLUNRESOLVED 
-            488779      7 INSTR FPTRSHADOW  [EDI+688] SHADOWID 9
+            488779      7 INSTR FPTRSHADOW  [RDI+688] SHADOWID 9
             488792      2 INSTR FPTRCHECK  RAX SHADOWID 9
             488870    231 FUNC RETURNTYPE RAX 1
             488870    231 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 4 ARG4 4 ARG5 4 
@@ -3756,11 +3756,11 @@
             4acc80    496 FUNC PROBLEM CRYPTO_gcm128_setiv CALLUNRESOLVED 
             4acd15      4 INSTR CHECK UNDERFLOW UNSIGNED 64  R13 ZZ IDIOM 31 sub     r13, 10h 
             4acde8      4 INSTR CHECK OVERFLOW UNSIGNED 64  RAX ZZ add     rax, 1 
-            4acc98      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 10
+            4acc98      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 10
             4acdac      3 INSTR FPTRCHECK  R14 SHADOWID 10
-            4acc98      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 11
+            4acc98      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 11
             4acdf7      3 INSTR FPTRCHECK  R14 SHADOWID 11
-            4acc98      7 INSTR FPTRSHADOW  [EDI+352] SHADOWID 12
+            4acc98      7 INSTR FPTRSHADOW  [RDI+352] SHADOWID 12
             4ace10      3 INSTR FPTRCHECK  R14 SHADOWID 12
             4ace70    411 FUNC RETURNTYPE RAX 1
             4ace70    411 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 1 ARG3 0 ARG4 1 ARG5 96 
@@ -4853,7 +4853,7 @@
             4cb180     79 FUNC RETURNTYPE RAX 1
             4cb180     79 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4cb180     79 FUNC PROBLEM RSA_set_method CALLUNRESOLVED 
-            4cb1b1      4 INSTR FPTRSHADOW  [EBP+56] SHADOWID 14
+            4cb1b1      4 INSTR FPTRSHADOW  [RBP+56] SHADOWID 14
             4cb1c1      2 INSTR FPTRCHECK  RAX SHADOWID 14
             4cb1d0    587 FUNC RETURNTYPE RAX 4
             4cb1d0    587 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 1 ARG5 96 
@@ -5045,7 +5045,7 @@
             4cf7c0     85 FUNC RETURNTYPE RAX 1
             4cf7c0     85 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4cf7c0     85 FUNC PROBLEM DSA_set_method CALLUNRESOLVED 
-            4cf7f7      4 INSTR FPTRSHADOW  [EBP+48] SHADOWID 15
+            4cf7f7      4 INSTR FPTRSHADOW  [RBP+48] SHADOWID 15
             4cf807      2 INSTR FPTRCHECK  RAX SHADOWID 15
             4cf820    518 FUNC RETURNTYPE RAX 4
             4cf820    518 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 1 ARG5 0 
@@ -5184,7 +5184,7 @@
             4d1950     91 FUNC RETURNTYPE RAX 1
             4d1950     91 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 0 ARG5 0 
             4d1950     91 FUNC PROBLEM DH_set_method CALLUNRESOLVED 
-            4d198a      4 INSTR FPTRSHADOW  [EBP+32] SHADOWID 16
+            4d198a      4 INSTR FPTRSHADOW  [RBP+32] SHADOWID 16
             4d199d      2 INSTR FPTRCHECK  RAX SHADOWID 16
             4d19b0    440 FUNC RETURNTYPE RAX 4
             4d19b0    440 FUNC INARGS    6  ARG0 0 ARG1 0 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
@@ -7421,42 +7421,42 @@
             4f5b60    110 FUNC RETURNTYPE RAX 1
             4f5b60    110 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f5b60    110 FUNC PROBLEM EVP_PKEY_sign_init CALLUNRESOLVED 
-            4f5b78      4 INSTR FPTRSHADOW  [EAX+64] SHADOWID 18
+            4f5b78      4 INSTR FPTRSHADOW  [RAX+64] SHADOWID 18
             4f5b8d      2 INSTR FPTRCHECK  RDX SHADOWID 18
             4f5bd0    294 FUNC RETURNTYPE RAX 0
             4f5bd0    294 FUNC PROBLEM EVP_PKEY_sign JUMPUNRESOLVED 
             4f5d00    110 FUNC RETURNTYPE RAX 1
             4f5d00    110 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f5d00    110 FUNC PROBLEM EVP_PKEY_verify_init CALLUNRESOLVED 
-            4f5d18      4 INSTR FPTRSHADOW  [EAX+80] SHADOWID 19
+            4f5d18      4 INSTR FPTRSHADOW  [RAX+80] SHADOWID 19
             4f5d2d      2 INSTR FPTRCHECK  RDX SHADOWID 19
             4f5d70    134 FUNC RETURNTYPE RAX 0
             4f5d70    134 FUNC PROBLEM EVP_PKEY_verify JUMPUNRESOLVED 
             4f5e00    110 FUNC RETURNTYPE RAX 1
             4f5e00    110 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f5e00    110 FUNC PROBLEM EVP_PKEY_verify_recover_init CALLUNRESOLVED 
-            4f5e18      4 INSTR FPTRSHADOW  [EAX+96] SHADOWID 20
+            4f5e18      4 INSTR FPTRSHADOW  [RAX+96] SHADOWID 20
             4f5e2d      2 INSTR FPTRCHECK  RDX SHADOWID 20
             4f5e70    294 FUNC RETURNTYPE RAX 0
             4f5e70    294 FUNC PROBLEM EVP_PKEY_verify_recover JUMPUNRESOLVED 
             4f5fa0    126 FUNC RETURNTYPE RAX 1
             4f5fa0    126 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f5fa0    126 FUNC PROBLEM EVP_PKEY_encrypt_init CALLUNRESOLVED 
-            4f5fbb      7 INSTR FPTRSHADOW  [EAX+144] SHADOWID 21
+            4f5fbb      7 INSTR FPTRSHADOW  [RAX+144] SHADOWID 21
             4f5fd3      2 INSTR FPTRCHECK  RDX SHADOWID 21
             4f6020    294 FUNC RETURNTYPE RAX 0
             4f6020    294 FUNC PROBLEM EVP_PKEY_encrypt JUMPUNRESOLVED 
             4f6150    126 FUNC RETURNTYPE RAX 1
             4f6150    126 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f6150    126 FUNC PROBLEM EVP_PKEY_decrypt_init CALLUNRESOLVED 
-            4f616b      7 INSTR FPTRSHADOW  [EAX+160] SHADOWID 22
+            4f616b      7 INSTR FPTRSHADOW  [RAX+160] SHADOWID 22
             4f6183      2 INSTR FPTRCHECK  RDX SHADOWID 22
             4f61d0    294 FUNC RETURNTYPE RAX 0
             4f61d0    294 FUNC PROBLEM EVP_PKEY_decrypt JUMPUNRESOLVED 
             4f6300    126 FUNC RETURNTYPE RAX 1
             4f6300    126 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             4f6300    126 FUNC PROBLEM EVP_PKEY_derive_init CALLUNRESOLVED 
-            4f631b      7 INSTR FPTRSHADOW  [EAX+176] SHADOWID 23
+            4f631b      7 INSTR FPTRSHADOW  [RAX+176] SHADOWID 23
             4f6333      2 INSTR FPTRCHECK  RDX SHADOWID 23
             4f6380    562 FUNC RETURNTYPE RAX 1
             4f6380    562 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 0 ARG4 96 ARG5 96 
@@ -7469,7 +7469,7 @@
             4f6700    110 FUNC RETURNTYPE RAX 1
             4f6700    110 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 96 ARG4 4 ARG5 96 
             4f6700    110 FUNC PROBLEM EVP_PKEY_paramgen_init CALLUNRESOLVED 
-            4f6718      4 INSTR FPTRSHADOW  [EAX+32] SHADOWID 24
+            4f6718      4 INSTR FPTRSHADOW  [RAX+32] SHADOWID 24
             4f672d      2 INSTR FPTRCHECK  RDX SHADOWID 24
             4f6770    259 FUNC RETURNTYPE RAX 1
             4f6770    259 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
@@ -7477,7 +7477,7 @@
             4f6880    110 FUNC RETURNTYPE RAX 1
             4f6880    110 FUNC INARGS    6  ARG0 4 ARG1 1 ARG2 0 ARG3 96 ARG4 96 ARG5 96 
             4f6880    110 FUNC PROBLEM EVP_PKEY_keygen_init CALLUNRESOLVED 
-            4f6898      4 INSTR FPTRSHADOW  [EAX+48] SHADOWID 25
+            4f6898      4 INSTR FPTRSHADOW  [RAX+48] SHADOWID 25
             4f68ad      2 INSTR FPTRCHECK  RDX SHADOWID 25
             4f68f0    259 FUNC RETURNTYPE RAX 1
             4f68f0    259 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
@@ -7493,7 +7493,7 @@
             4f6a70    225 FUNC RETURNTYPE RAX 1
             4f6a70    225 FUNC INARGS    6  ARG0 1 ARG1 96 ARG2 4 ARG3 1 ARG4 4 ARG5 96 
             4f6a70    225 FUNC PROBLEM EVP_PKEY_new_mac_key CALLUNRESOLVED 
-            4f6ab3      4 INSTR FPTRSHADOW  [EAX+48] SHADOWID 26
+            4f6ab3      4 INSTR FPTRSHADOW  [RAX+48] SHADOWID 26
             4f6ac6      2 INSTR FPTRCHECK  RAX SHADOWID 26
             4f6b60    454 FUNC RETURNTYPE RAX 1
             4f6b60    454 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 96 ARG4 96 ARG5 1 
@@ -11109,7 +11109,7 @@
             539550    270 FUNC RETURNTYPE RAX 96
             539550    270 FUNC INARGS    6  ARG0 4 ARG1 0 ARG2 0 ARG3 1 ARG4 96 ARG5 96 
             539550    270 FUNC PROBLEM COMP_CTX_new CALLUNRESOLVED 
-            5395b2      4 INSTR FPTRSHADOW  [EBX+16] SHADOWID 28
+            5395b2      4 INSTR FPTRSHADOW  [RBX+16] SHADOWID 28
             5395c2      2 INSTR FPTRCHECK  RAX SHADOWID 28
             539660     34 FUNC RETURNTYPE RAX 96
             539660     34 FUNC INARGS    6  ARG0 4 ARG1 96 ARG2 4 ARG3 1 ARG4 4 ARG5 96 
@@ -13716,7 +13716,7 @@
             57ed70    450 FUNC RETURNTYPE RAX 96
             57ed70    450 FUNC INARGS    6  ARG0 4 ARG1 4 ARG2 4 ARG3 96 ARG4 96 ARG5 96 
             57ed70    450 FUNC PROBLEM DSO_new_method CALLUNRESOLVED 
-            57ee08      4 INSTR FPTRSHADOW  [EBP+64] SHADOWID 30
+            57ee08      4 INSTR FPTRSHADOW  [RBP+64] SHADOWID 30
             57ee17      2 INSTR FPTRCHECK  RAX SHADOWID 30
             57ef40      7 FUNC RETURNTYPE RAX 4
             57ef40      7 FUNC INARGS    6  ARG0 0 ARG1 4 ARG2 0 ARG3 4 ARG4 0 ARG5 0 
-- 
GitLab