From ab7134eff591b0996578ebb881a165eb527e1810 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 13 Feb 2018 20:47:34 +0100 Subject: [PATCH] VMS: add the possibility to use Itanium assembler with 'ias' This does require the use of a port of 'ias' for VMS. Reviewed-by: Andy Polyakov (Merged from https://github.com/openssl/openssl/pull/5357) --- Configurations/10-main.conf | 15 +++ Configurations/descrip.mms.tmpl | 180 +++++++++++++++++++++++--------- 2 files changed, 143 insertions(+), 52 deletions(-) diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf index f66e35bd52..c9e4fd2e0f 100644 --- a/Configurations/10-main.conf +++ b/Configurations/10-main.conf @@ -146,6 +146,16 @@ sub vms_info { $vms_info->{def_zlib} =~ s|/.*$||g; } } + + if ($config{target} =~ /-ia64/) { + `PIPE ias -H 2> NL:`; + if ($? == 0) { + $vms_info->{as} = "ias"; + $vms_info->{asflags} = '-d debug "-N" vms_upcase'; + $vms_info->{asoutflag} = "-o"; + $vms_info->{perlasm_scheme} = "ias"; + } + } } return $vms_info; } @@ -1876,6 +1886,11 @@ my %targets = ( dso_scheme => "vms", thread_scheme => "pthreads", + as => sub { vms_info()->{as} }, + asflags => sub { vms_info()->{asflags} }, + asoutflag => sub { vms_info()->{asoutflag} }, + perlasm_scheme => sub { vms_info()->{perlasm_scheme} }, + apps_aux_src => "vms_term_sock.c", apps_init_src => "vms_decc_init.c", }, diff --git a/Configurations/descrip.mms.tmpl b/Configurations/descrip.mms.tmpl index f095214b07..ab2485ae37 100644 --- a/Configurations/descrip.mms.tmpl +++ b/Configurations/descrip.mms.tmpl @@ -54,7 +54,7 @@ our @install_shlibs = map { $unified_info{sharednames}->{$_} || () } grep(!/\.a$/, @{$unified_info{install}->{libraries}}); - our @generated = ( ( map { (my $x = $_) =~ s|\.S$|\.s|; $x } + our @generated = ( ( map { (my $x = $_) =~ s|\.[sS]$|\.asm|; $x } grep { defined $unified_info{generate}->{$_} } map { @{$unified_info{sources}->{$_}} } grep { /\.o$/ } keys %{$unified_info{sources}} ), @@ -211,13 +211,10 @@ NO_INST_BIN_CFLAGS=$(CFLAGS){- $target{no_inst_bin_cflags} PERL={- $config{perl} -} -# We let the C compiler driver to take care of .s files. This is done in -# order to be excused from maintaining a separate set of architecture -# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC -# gcc, then the driver will automatically translate it to -xarch=v8plus -# and pass it down to assembler. AS={- $config{as} -} -ASFLAGS={- join('', @{$config{asflags}}) -} +ASFLAGS={- join(' ', @{$config{asflags}}) -} +ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY) +PERLASM_SCHEME={- $target{perlasm_scheme} -} # .FIRST and .LAST are special targets with MMS and MMK. # The defines in there are for C. includes that look like @@ -587,37 +584,128 @@ reconfigure reconf : : $unified_info{sharednames}->{$_}.".EXE" } @_; } + # Helper function to deal with inclusion directory specs. + # We have to deal with two things: + # 1. comma separation and no possibility of trailing comma + # 2. no inclusion directories given at all + # 3. long compiler command lines + # To resolve 1, we need to iterate through the sources of inclusion + # directories, and only add a comma when needed. + # To resolve 2, we need to have a variable that will hold the whole + # inclusion qualifier, or be the empty string if there are no inclusion + # directories. That's the symbol 'qual_includes' that's used in CPPFLAGS + # To resolve 3, we creata a logical name TMP_INCLUDES: to hold the list + # of inclusion directories. + # + # This function returns a list of two lists, one being the collection of + # commands to execute before the compiler is called, and the other being + # the collection of commands to execute after. It takes as arguments the + # collection of strings to include as directory specs. + sub includes { + my @stuff = ( @_ ); + my @before = ( + 'qual_includes :=', + ); + my @after = ( + 'DELETE/SYMBOL/LOCAL qual_includes', + ); + + if (scalar @stuff > 0) { + push @before, 'tmp_includes := '.shift(@stuff); + while (@stuff) { + push @before, 'tmp_add := '.shift(@stuff); + push @before, 'IF tmp_includes .NES. "" .AND. tmp_add .NES. "" THEN tmp_includes = tmp_includes + ","'; + push @before, 'tmp_includes = tmp_includes + tmp_add'; + } + push @before, "IF tmp_includes .NES. \"\" THEN DEFINE tmp_includes 'tmp_includes'"; + push @before, 'IF tmp_includes .NES. "" THEN qual_includes := /INCLUDE=(tmp_includes:)'; + push @before, 'DELETE/SYMBOL/LOCAL tmp_includes'; + push @before, 'DELETE/SYMBOL/LOCAL tmp_add'; + push @after, 'DEASSIGN tmp_includes:' + } + return ([ @before ], [ @after ]); + } + sub generatesrc { my %args = @_; + (my $target = $args{src}) =~ s/\.[sS]$/.asm/; my $generator = join(" ", @{$args{generator}}); my $generator_incs = join("", map { ' "-I'.$_.'"' } @{$args{generator_incs}}); my $deps = join(", -\n\t\t", @{$args{generator_deps}}, @{$args{deps}}); - if ($args{src} !~ /\.[sS]$/) { + if ($target !~ /\.asm$/) { if ($args{generator}->[0] =~ m|^.*\.in$|) { my $dofile = abs2rel(rel2abs(catfile($config{sourcedir}, "util", "dofile.pl")), rel2abs($config{builddir})); return <<"EOF"; -$args{src} : $args{generator}->[0] $deps +$target : $args{generator}->[0] $deps \$(PERL) "-I\$(BLDDIR)" "-Mconfigdata" $dofile \\ - "-o$target{build_file}" $generator > \$@ + "-o$target{build_file}" $generator > \$\@ EOF } else { return <<"EOF"; -$args{src} : $args{generator}->[0] $deps - \$(PERL)$generator_incs $generator > \$@ +$target : $args{generator}->[0] $deps + \$(PERL)$generator_incs $generator > \$\@ EOF } } else { - die "No method to generate assembler source present.\n"; + if ($args{generator}->[0] =~ /\.pl$/) { + $generator = '$(PERL)'.$generator_incs.' '.$generator; + } elsif ($args{generator}->[0] =~ /\.S$/) { + $generator = undef; + } else { + die "Generator type for $src unknown: $generator\n"; + } + + my $cppflags = { lib => '$(LIB_CPPFLAGS)', + dso => '$(DSO_CPPFLAGS)', + bin => '$(BIN_CPPFLAGS)' } -> {$args{intent}}; + my @incs_cmds = includes({ lib => '$(LIB_INCLUDES)', + dso => '$(DSO_INCLUDES)', + bin => '$(BIN_INCLUDES)' } -> {$args{intent}}, + '$(INCLUDES)', + @{$args{incs}}); + my $incs_on = join("\n\t\@ ", @{$incs_cmds[0]}) || '!'; + my $incs_off = join("\n\t\@ ", @{$incs_cmds[1]}) || '!'; + if (defined($generator)) { + # If the target is named foo.S in build.info, we want to + # end up generating foo.s in two steps. + if ($args{src} =~ /\.S$/) { + return <<"EOF"; +$target : $args{generator}->[0] $deps + $generator \$\@-S + \@ $incs_on + PIPE \$(CPP) $cppflags \$\@-S | - + \$(PERL) -ne "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@-i + \@ $incs_off + RENAME \$\@-i \$\@ + DELETE \$\@-S +EOF + } + # Otherwise.... + return <<"EOF"; +$target : $args{generator}->[0] $deps + $generator \$\@ +EOF + } + return <<"EOF"; +$target : $args{generator}->[0] $deps + \@ $incs_on + SHOW SYMBOL qual_includes + PIPE \$(CPP) $cppflags $args{generator}->[0] | - + \$(PERL) "-ne" "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@ + \@ $incs_off +EOF } } sub src2obj { my %args = @_; + my @srcs = map { (my $x = $_) =~ s/\.s$/.asm/; $x + } ( @{$args{srcs}} ); (my $obj = $args{obj}) =~ s|\.o$||; - my $deps = join(", -\n\t\t", @{$args{srcs}}, @{$args{deps}}); + my $deps = join(", -\n\t\t", @srcs, @{$args{deps}}); # Because VMS C isn't very good at combining a /INCLUDE path with # #includes having a relative directory (like '#include "../foo.h"), @@ -630,9 +718,21 @@ EOF my $objd = abs2rel(rel2abs(dirname($obj)), rel2abs($forward)); my $objn = basename($obj); my $srcs = - join(", ", - map { abs2rel(rel2abs($_), rel2abs($forward)) } @{$args{srcs}}); - my $cflags = '$(CFLAGS)'; + join(", ", map { abs2rel(rel2abs($_), rel2abs($forward)) } @srcs); + my $before = $unified_info{before}->{$obj.".OBJ"} || "\@ !"; + my $after = $unified_info{after}->{$obj.".OBJ"} || "\@ !"; + + if ($srcs[0] =~ /\.asm$/) { + return <<"EOF"; +$obj.OBJ : $deps + ${before} + SET DEFAULT $forward + \$(AS) \$(ASFLAGS) \$(ASOUTFLAG)${objd}${objn}.OBJ $srcs + SET DEFAULT $backward +EOF + } + + my $cflags; if ($args{installed}) { $cflags = { lib => '$(LIB_CFLAGS)', dso => '$(DSO_CFLAGS)', @@ -645,41 +745,17 @@ EOF $cflags .= { lib => '$(LIB_CPPFLAGS)', dso => '$(DSO_CPPFLAGS)', bin => '$(BIN_CPPFLAGS)' } -> {$args{intent}}; - - # We create a logical name TMP_INCLUDES: to hold the list of internal - # includes. However, we cannot use it directly, as logical names can't - # hold zero entries, so we also create a symbol with the same name and - # use that instead, see the '/INCLUDE=' assignment above. If there are - # no internal include directories, it will simply be the empty string, - # but if there are, it will be assigned "TMP_DEFINES:," - my $xtraincludes = { lib => '$(LIB_INCLUDES)', - dso => '$(DSO_INCLUDES)', - bin => '$(BIN_INCLUDES)' } -> {$args{intent}}; - my $incs_add = - 'IF tmp_add .NES. "" .AND. tmp_includes .NES. "" THEN tmp_includes = "," + tmp_includes' - ."\n\t".'tmp_includes = tmp_add + tmp_includes'; - my $incs_on = 'tmp_includes := ' - ."\n\t"."tmp_add := $xtraincludes" - ."\n\t".$incs_add - ."\n\t".'tmp_add := $(INCLUDES)' - ."\n\t".$incs_add; - my $incs_off = 'DELETE/SYMBOL/LOCAL tmp_includes' - ."\n\t".'DELETE/SYMBOL/LOCAL tmp_add'; - if (@{$args{incs}}) { - $incs_on = - 'DEFINE tmp_includes ' - .join(",-\n\t\t\t", map { - file_name_is_absolute($_) - ? $_ : catdir($backward,$_) - } @{$args{incs}}) - ."\n\t".$incs_on - ."\n\t".'IF tmp_includes .NES. "" THEN tmp_includes = "," + tmp_includes' - ."\n\t".'tmp_includes = "tmp_includes:" + tmp_includes'; - $incs_off .= - "\n\t".'DEASSIGN tmp_includes'; - } - my $before = $unified_info{before}->{$obj.".OBJ"} || "\@ !"; - my $after = $unified_info{after}->{$obj.".OBJ"} || "\@ !"; + + my @incs_cmds = includes({ lib => '$(LIB_INCLUDES)', + dso => '$(DSO_INCLUDES)', + bin => '$(BIN_INCLUDES)' } -> {$args{intent}}, + '$(INCLUDES)', + map { + file_name_is_absolute($_) + ? $_ : catdir($backward,$_) + } @{$args{incs}}); + my $incs_on = join("\n\t\@ ", @{$incs_cmds[0]}) || '!'; + my $incs_off = join("\n\t\@ ", @{$incs_cmds[1]}) || '!'; my $depbuild = $disabled{makedepend} ? "" : " /MMS=(FILE=${objd}${objn}.tmp-D,TARGET=$obj.OBJ)"; -- 2.25.1