2015-05-05 22 views
-1

我有幾個基準像fft,dijkstra。我想收集所有庫函數和用戶定義函數的堆棧大小。 C代碼也可用。如何從c代碼中提取所有庫函數的堆棧大小?

我管理硬件緩存,所以我需要每個小函數,變量的確切堆棧大小。

+0

你爲什麼要問? –

+0

請**編輯您的問題**以改進*,並解釋您爲什麼問及您的動機。 –

+0

@BasileStarynkevitch我管理硬件緩存,所以我需要每個小函數,變量和常量的確切堆棧大小。但現在功能沒問題。 – huuy

回答

1

如果與最近GCC編譯你可以在-fstack-usage標誌(除了優化的標誌如果有的話)傳遞給gcc其中:

使該程序的編譯器輸出堆棧使用信息,在每功能基礎。轉儲的文件名是通過將.su添加到auxname中進行的。 auxname是從輸出文件的名稱生成的,如果明確指定並且它不是可執行文件,則它是源文件的基本名稱。一個條目由三個字段組成:

函數的名稱。 許多字節。 一個或多個限定符:staticdynamicbounded

限定符static表示該函數靜態操作堆棧:在函數入口處爲幀分配固定數量的字節,並在函數出口處釋放該字節;功能中不會進行堆疊調整。第二個字段是這個固定的字節數。

限定符dynamic意味着該函數動態操縱堆棧:除了上述靜態分配之外,還可以在函數體中進行堆棧調整,例如在函數調用周圍推/拉參數。如果限定符bounded也存在,則這些調整的數量在編譯時有界,第二個字段是函數使用的堆棧總量的上限。如果不存在,則這些調整的數量在編譯時不受限制,而第二個字段僅表示有界部分。

你也可以通過一個-Wstack-usage=LENwarning flag,其中:

警告如果一個函數的棧使用量可能大於len個字節。完成確定堆棧使用情況的計算是保守的。編譯器在確定是否發出警告時包含通過alloca,可變長度數組或相關結構分配的任何空間。

最後,您可能會考慮使用MELT來爲您的目的自定義編譯器。例如,您可以考慮將GCC擴展爲 MELT擴展名,以便在您的每個函數中使用動態堆棧使用。

當然,如果你想要庫的相同信息,你應該從他們的源代碼重新編譯它們。

順便說一句,的一些函數的堆棧用法,或一些函數調用事件,可能會被不明確的(當然取決於優化標誌和目標系統)中,由於GCC是有時能夠tail call優化,和功能inlining(即使在功能不合格inline!)和/或function cloning。另外,某些編譯器可能會使用一些內部的builtin函數來編譯它們,但有些功能(printf,memset,...)幾乎不知道。最後,編譯link-time optimizations(使用-flto)的幾個軟件(和越來越多的庫),那麼單個函數的堆棧使用沒有很好的定義(因爲它們通常是內聯的)。

所以我不確定你的問題是否有任何精確的意義。你可能會改變它並激勵和改進它。

+0

Iam在主要功能中打印hello world。 .su文件的輸出是: - helloworld.c:4:5:主要靜態雖然我想檢查所有庫函數單獨。它只顯示主函數的堆棧大小和用戶定義函數的堆棧大小。有什麼方法可以單獨查找庫函數的堆棧大小嗎? – huuy