ARM - ADS, RealView 編譯工具(節選2)

 
Specifying output format
默認情況下,源文件被編譯並鏈接到可執行映像中。利用這些選項,可指導編譯程序從C或C++源文件創建未鏈接的目標文件、彙編語言文件或列表文件。
     -asm      將編譯程序產生的彙編語言列表寫入文件。如果不使用-c選項,生成目標代碼。如果和-fs使用,用匯編列表交叉存取源文件,並且源文件輸出到.txt文件。
§          -asm    inputname.s用於結果列表
§          -asm –fs 因爲不可用將交叉存取代碼輸入彙編程序,所以使用inputname.txt來保存交叉存取代碼。
§          -asm –c –o newname.ext   有兩個輸出文件(通常newname.o用於目標代碼,newname.s用於彙編)。如果.ext不是.s或.o,則newname.exe是目標文件的名稱,newname.s則是列表文件的名稱
§          -asm –fs –c –o newname.ext 同-asm –c –o newname.ext作用相同,區別在於列表文件具有交叉存取源代碼和.txt擴展名。
     -c        只編譯程序不執行鏈接階段。編譯程序編譯源程序,並將目標文件寫入當前目錄或由-o file指定的文件
    -list       使用基於輸入文件名的名稱在文件中生成原始列表信息。該信息通常用於生成已格式化的列表。原始列表信息包含原始源語句行、包含文件轉入轉出信息及編譯程序生成的診斷信息。其使用options包含-fi、-fj和-fu。
     -o file       命名保存編譯的最終輸出的文件
   -MD         該選項編譯源代碼並將makefile依賴行寫入文件。
     -depend filename   將依賴行的輸出文件指定到filename

-S              將編譯程序產生的彙編語言列表寫入文件,與-asm不同,該編譯選項並不進行編譯輸出目標文件 

 

指定目標處理器或體系結構
The options describe in this section specify the target processor or architecture attributes for a compile.利用這些選項可指定編譯的目標處理器或體系結構屬性。默認情況下,-cpu指定是-cpu ARM7TDMI。
-cpu name: This option generates code for a specific ARM processor or architecture
其中name可以爲:
3、3M、4、4xM、4T、4TxM、5T、5TE、5TEJ
-fpu name : This option selects the target Floating-Point Unit(FPU) architecture.
該選項的值可爲:

nonevfpvfpv1vfpv2fpasoftvfp+vfpsoftvfp+vfpv2softvfpsoftfpa

 

Generating debug information
利用這些選項可指定是否爲當前編譯生成調試表
-g     該選項啓用生成當前編譯的調試表。無論是否使用-g,編譯程序生成相同的代碼,不同之處在於調試表的存在與否。由-o指定調試代碼的優化選項,默認情況下,-g選項自身等價於-g –dwarf2 –o0 –gt+p

-gt+p 該選項與-g一起使用,該選項啓動生成預處理程序宏定義的調試表條目

 

Controlling code generation

Option
Desc
-Onumber
指定優化級別。優化級別可爲:
-o0         關閉所有優化,除去一些簡單的源轉換。如果使用-g生成調試表,此爲默認優化級別。它給出最佳可能調試視圖和優化的最低級別
-o1          關閉嚴重影響調試視圖的優化。如果和-g一起使用,該選項給出良好合適代碼密度的滿意調試試圖
-o2          生成充分優化代碼。如果與-g一起使用,調試視圖可能不令人滿意,因爲目標代碼和源代碼的映射有時不清晰。
-ospace
指示編譯程序執行優化,以可能延長執行時間爲代價減少映像大小。例如,由外部函數而非內聯代碼執行大的結構副本。若代碼大小比性能更重要,則使用該選項,這是默認設置
-otime
指示編譯程序執行優化,以可能增大映像大小爲代價縮短執行時間。不能同時使用-ospace-otime
-Ono_inline
禁止使用函數的內聯。該選項可幫助調試內聯函數
-Oinline
啓用編譯內聯函數程序。此時inline叫限定符;而C中的__inlineCC++中的_forceinlineinline則叫關鍵字。
-Ono_autoline
禁用自動內聯,這是-o1-o0的默認設置
-Oautoinline
啓用自動內聯,-o2默認打開自動內聯
-split_ldm
指示編譯程序在所需要位置將LDMSTM指令分裂爲兩個或更多的LDMSTM指令,以減少傳送寄存器的最大數量
控制代碼和數據段
-zo
該選項爲源文件中的每個函數生成一個ELF段。使用與生成段的函數相同的名稱命名輸出段。例如
int f(int x) {return x + 1;}
 
使用-zo編譯給出:
AREA ||i.f||, CODE, READONLY
f    PROC
ADD r0, r0, #1
MOV pc, lr
該選項減少了函數之間共享地址、數據和字符串文字的可能性。可以通過armlink –remove允許鏈接程序時刪除不用的函數。
配合該選項,可以使用分散加載描述文件將一些函數放在快速存儲器中,其餘函數放在慢速存儲器中
-littleend
該選項使用小端存儲器生成用於ARM處理器的代碼。在小端存儲器中,字的最低位字節具有最低地址。這是默認設置
-bigend
該選項使用大端存儲器生成ARM處理器代碼。
Setting alignment options
-memaccess option
向編譯程序指定目標系統中的存儲器稍微具有受限制的或擴展的能力
-fy
強制所有枚舉類型爲整型存儲。不要常用該選項,因與ISO不兼容
-zc
使char類型帶有符號。該選項不要常用,ISO兼容源不要求該選項
ARM編譯程序參考
介紹ARM編譯程序的ARM特有方面,包括:
Pragmas                                     編譯指示
Function keywords                    函數關鍵字
Variable declaration keywords 變量聲明關鍵字
 
Pragmas
ARM編譯程序可識別一下格式的編譯指示:
#pragma [no_] feature-name
編譯指示優於相關的命令行選項。
能識別的編譯選項如下:
 

Pragma name
Default
Reference
arm section
Off
Pragmas controlling code generation
check_printf_formats
Off
Pragmas controlling printf and scanf argument checking
check_scanf_formats
Off
Pragmas controlling printf and scanf argument checking
check_stack
On
Pragmas controlling code generation
debug
On
Pragmas controlling debugging
import
 
code generation
Ospace
 
optimization
Otime
 
optimization
Onum
 
optimization
softfp_linkage
Off
code generation

 

  • check_printf_formats
該編譯指示標記類似於printf的函數,如果存在文字格式串,則對照進行類型檢查。
#pragma check_printf_formats
extern void myprintf(const char *format, …);
#pragma no_check_printf_formats
  • check_scanf_formats
該編譯指示對聲明爲類似於scanf的函數做標記,以便對照文字格式串檢查自變量的格式。
#pragma check_scanf_formats
extern void myformat(const char *format, …);
#pragma no_check_scanf_formats
  • debug 該編譯指示可打開或關閉調試表生成, 如果指定#pragma no_debug,則不會爲隨後的聲明和函數生成調試信息表條目,直到下一個#pragma debug出現。
  • Pragmas controlling optimization
Ospace
Otime
Onum
  • Pragmas controlling code generation
    • check_stack 如果已經使用了#pragma no_check_stack和-apcs/swst命令行選項禁止棧檢查,則該編譯指示可使的檢查是否違反了棧限制的函數入口代碼的重新生成。
    • once             同#ifndef …#endif效果相類似,用於頭文件。但一般推薦使用#ifndef…#define。
    • softfp_linkage   該編譯指示指定了至下一個#pragma no_softfp_linkage之間的所有函數聲明描述了使用軟件浮點鏈接的函數。__softfp關鍵字與該編譯指示的效果相同
    • import(symbol_name) 該編譯指示生成對symbol_name的導入引用。同如下彙編語言相同:IMPORT symbol_name。符號名作爲外部符號放在映像的符號表中。
    • arm section section_sort_list This pragma specifies the code or data section name that used for subsequent function or objects.This include definitions of anonymous objects the compiler creates for initializations.該編譯指示可指定代碼或數據段的名稱用於隨後的函數或對象。包括編譯程序爲初始化而創建的匿名對象的定義。該選項對一下情況沒有影響:
內聯函數(及其局部靜態變量)
模板實例(及其局部靜態變量)
消除未使用的變量和函數
將定義寫入目標文件中的順序
                        該編譯指示完整語法爲:
                                #pragma arm section [sort_type[[=]“name”]][,sort_type=  
“name”]
                        此處name用於段名稱,sort_type可爲如下之一code, rwdata, rodata
                        和zidata。若指定sort_type,沒有指定name,則sort_type的段名被
                        重新設置爲默認值。單獨輸入#pragma arm section,則所以對象段的
                         恢復爲其默認值
int x1 = 5;                     // in .data (default)
    int y1[100];                    // in .bss (default)
    int const z1[3= {1,2,3};      // in .constdata (default)
 #pragma arm section rwdata = "foo", rodata = "bar"

 
int x2 = 5;                     // in foo (data part of region)
 int y2[100];                    // in .bss
     int const z2[3={1,2,3};      // in bar
 
char *s2 = "abc";               // s2 in foo, "abc" in bar
  #pragma arm section rodata
  
int x3 = 5;                     // in foo
  int y3[100];                    // in .bss
      int const z3[3={1,2,3};      // in .constdata
  char *s3 = "abc";               // s3 in foo, "abc" in .constdata
  #pragma arm section code = "foo"
   
int add1(int x)                   // in foo (code part of region)
      {
       
return x+1;
      }
 
    
#pragma arm section code
 
使用分散加載描述文件和鏈接程序,以控制將命名段放置在存儲器中
                         的特定地址。
·          Function keywords
一些關鍵字指示編譯程序對其某個函數進行特殊處理。包括函數內的聲明,函數限定符及函數存儲類限定符。即Declarations inside function, Function qualifiers and Function storage.
      __asm{assembler-code} 指示編譯程序該語句是用彙編語言編寫的。
      __irq      This enables a C or C++ function to be used as an interrupt routine called by the IRQ, or FIQ vectors. All corrupted registers except floating-point registers are preserved, not only those that are normally preserved under the ATPCS. The default ATPCS mode must be used. The function exits by setting the pc to lr-4 and the CPSR to the value in SPSR. It is not available in tcc or tcpp. No arguments or return values can be used with __irq functions.
      __pure      指明函數聲明爲純的。純函數沒有了公共子表達式。默認情況下,函數假定是不純的(產生副作用)。純函數需要滿足:其結果僅取決於其自變量的值;沒有副作用,其不能調用非純函數。不能使用全局變量或廢棄指針,同一參數兩次調用純函數,返回應該相同。
發佈了63 篇原創文章 · 獲贊 3 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章