2012-08-15 58 views
2

我想知道是否有辦法從Ada泛型中獲得更小/更高效的彙編代碼。Ada泛型和彙編代碼生成

例如,我已經寫了一個小假的Ada程序(main.adb)顯示&實例化它的6倍通用過程:,我使用gnatmake main.adb

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; 

編譯的時候我看導致objdump -d -S main > main.dump我看到有6款爲每個通用實例化:

000000000040275f <main__baa.2182>: 
    40275f: 55      push %rbp 
    402760: 48 89 e5    mov %rsp,%rbp 

... <剪斷>

0000000000402a05 <main__caa.2187>: 
    402a05: 55      push %rbp 
    402a06: 48 89 e5    mov %rsp,%rbp 

... <剪斷> 等等

每個具有非常相似的代碼,所以我懷疑的情況是,gnatmake使用Thing_Gen爲模板,擴大代碼爲每個實例,而爲比重用一些參數的代碼。

所以問題是,如何讓gnatmake重用泛型的代碼,而不是爲每個實例化複製/粘貼?

我本來期望的實例已經採取的一種形式:

  1. 設置巴阿/應用泛型參數(我知道X是有This_Value &程序BobThis_Address
  2. 呼叫Thing_Gen (然後使用設置來產生預期結果的 )

導致重新使用Thing_Gen代碼。但這似乎並非如此。解釋爲什麼我在彙編中是個菜鳥&編譯器問題也歡迎!

注意:同樣的結果Sparc & Intel! (英特爾gnatmake版本4.4.3)

+0

您使用過哪些編譯器標誌? – 2012-08-15 09:35:11

+0

@ChristianForler無。完整的命令是提供'gnatmake main.adb' – NWS 2012-08-15 10:32:24

+0

(Upvoted讓你超過1000,享受你的新特權。嗚嗚!:-) – 2012-08-16 11:48:11

回答

3

我不認爲你可以讓Gnat做共享的泛型,因爲泛型的代碼生成是編譯器實現者的設計選擇,而AdaCore選擇了複製。

根據this thread,RR和Irvine支持共享仿製藥。

+0

謝謝馬克,那個線程是非常翔實的:) – NWS 2012-08-15 12:49:47

+1

+1。我清楚地記得某處存在「pragma shared_generic」。一個快速的谷歌搜索表明我是一個VMS Ada(83)編譯器選項。我認爲,在92年前後,我最後一次使用該編譯器。哇,那是很久以前的... – 2012-08-16 16:35:20

+1

@ T.E.D。我自己的谷歌搜索現在已經找到它的附註share_generic :) – NWS 2012-08-16 21:37:00