Commit 3ebf898e authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Support for indirect calls in x86 assembler modules.

parent a4c886e4
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -172,6 +172,7 @@ sub main'popf { &out0("popfd"); $stack-=4; }
sub main'bswap	{ &out1("bswap",@_); &using486(); }
sub main'not	{ &out1("not",@_); }
sub main'call	{ &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
sub main'call_ptr { &out1p("call",@_); }
sub main'ret	{ &out0("ret"); }
sub main'nop	{ &out0("nop"); }
sub main'test	{ &out2("test",@_); }
@@ -452,10 +453,10 @@ sub main'initseg
	local($f)=@_;
	local($tmp)=<<___;
OPTION	DOTNAME
.CRT\$XIU	SEGMENT DWORD PUBLIC 'DATA'
.CRT\$XCU	SEGMENT DWORD PUBLIC 'DATA'
EXTRN	_$f:NEAR
DD	_$f
.CRT\$XIU	ENDS
.CRT\$XCU	ENDS
___
	push(@out,$tmp);
	}
+3 −2
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ sub main'popf { &out0("popfd"); $stack-=4; }
sub main'bswap	{ &out1("bswap",@_); &using486(); }
sub main'not	{ &out1("not",@_); }
sub main'call	{ &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); }
sub main'call_ptr { &out1p("call",@_); }
sub main'ret	{ &out0("ret"); }
sub main'nop	{ &out0("nop"); }
sub main'test	{ &out2("test",@_); }
@@ -439,7 +440,7 @@ sub main'initseg
	if ($main'win32)
		{
		local($tmp)=<<___;
segment	.CRT\$XIU data
segment	.CRT\$XCU data
extern	$under$f
DD	$under$f
___
+1 −0
Original line number Diff line number Diff line
@@ -200,6 +200,7 @@ sub main'call { my $pre=$under;
			{ if ($label{$i} eq $_[0]) { $pre=''; last; } }
			&out1("call",$pre.$_[0]);
		}
sub main'call_ptr { &out1p("call",@_); }
sub main'ret	{ &out0("ret"); }
sub main'nop	{ &out0("nop"); }
sub main'test	{ &out2("testl",@_); }
+1 −1
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
		&mov	("eax",&DWP(12+$i*4,"ebp"));
		&mov	(&DWP(0+$i*4,"esp"),"eax");
		}
	&call	(&DWP(8,"ebp"));# make the call...
	&call_ptr	(&DWP(8,"ebp"));# make the call...
	&mov	("esp","ebp");	# ... and just restore the stack pointer
				# without paying attention to what we called,
				# (__cdecl *func) or (__stdcall *one).