首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada Generics &汇编代码生成

Ada Generics &汇编代码生成
EN

Stack Overflow用户
提问于 2012-08-15 08:35:11
回答 1查看 419关注 0票数 2

我想知道是否有办法从Ada泛型中获得更小/更高效的汇编程序代码。

例如,我编写了一个小型虚拟Ada程序(main.adb)来显示一个通用过程&实例化它6次:

代码语言:javascript
复制
with Ada.Text_Io;
procedure Main is

   generic
      X : Natural;
      with procedure Bob (S : in String);
   procedure Thing_Gen (S : in String);

   procedure Thing_Gen (S : in String) is
   begin
      for I in 0 .. X loop
         Bob (Natural'Image (I) & " " & S);
      end loop;
   end Thing_Gen;

   procedure Alice (S : in String) is
   begin
      Ada.Text_Io.Put_Line ("Alice:" & S);
   end Alice;

   procedure Aaa is new Thing_Gen (X => 1, Bob => Alice);
   procedure Baa is new Thing_Gen (X => 2, Bob => Alice);
   procedure Caa is new Thing_Gen (X => 3, Bob => Alice);
   procedure Daa is new Thing_Gen (X => 4, Bob => Alice);
   procedure Eaa is new Thing_Gen (X => 5, Bob => Alice);
   procedure Faa is new Thing_Gen (X => 6, Bob => Alice);

begin

   Aaa("A");
   Baa("B");
   Caa("C");
   Daa("D");
   Eaa("E");
   Faa("F");

end Main;

要编译,我使用的是gnatmake main.adb,当我查看生成的objdump -d -S main > main.dump时,我看到每个泛型实例化有6个部分:

代码语言:javascript
复制
000000000040275f <main__baa.2182>:
  40275f:   55                      push   %rbp
  402760:   48 89 e5                mov    %rsp,%rbp

.<狙击>

代码语言:javascript
复制
0000000000402a05 <main__caa.2187>:
  402a05:   55                      push   %rbp
  402a06:   48 89 e5                mov    %rsp,%rbp

.<狙击>等等.

每个代码都有非常相似的代码,所以我怀疑的是,gnatmake使用Thing_Gen作为模板,并为每个实例化扩展代码,而不是使用一些参数重用代码。

所以问题是,如何使gnatmake重用泛型的代码,而不是对每个实例化进行复制/粘贴?

我本以为实例化的形式是:

  1. 设置Baa /应用泛型参数(我知道X将有This_Value & procedure BobThis_Address)
  2. 调用Thing_Gen (然后使用安装程序生成预期结果)

导致Thing_Gen代码的重用。但情况似乎并非如此。解释为什么我是一个菜鸟在汇编程序和编译器的问题也欢迎!

注: Sparc和Intel的结果相同!(英特尔公司的4.4.3版)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-15 11:06:43

我认为您不能让Gnat做共享的泛型,因为泛型的代码生成是编译器实现者的设计选择,而AdaCore选择了复制。

根据这条线的说法,RR和欧文支持共享的泛型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11966247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档