簡體   English   中英

關閉gcc 4.2.2中特定功能的優化

[英]Switching off optimization for a specific function in gcc 4.2.2

是否可以關閉特定功能的優化? 我的一個朋友遇到的問題是,gcc優化使某些(我不知道)μ控制器代碼無法正常工作。 我們知道它是哪個函數,但是我們對代碼本身一無所知,因此最簡單,最安全的方法可能就是將整個函數都關閉。

可悲的是, http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html顯示了一個優化函數屬性/ pragma,但是它需要gcc 4.4,而我們沒有。

提前致謝

如果編譯指示對您不起作用,請嘗試將該函數拆分為自己的文件,然后在未設置優化標志的情況下編譯該文件。

您可以將函數放在單獨的文件中,而無需進行優化即可編譯該文件,但是更好的解決方案是找出代碼的問題並進行修復。

使用gcc啟用優化時出現的最常見錯誤之一是使用嚴格的別名。 確保已啟用所有警告,並查看是否收到任何可能幫助您找出問題所在的警告。 如果您無法解決問題,請嘗試將問題簡化為一個完整的小型程序,然后在此處發布。

到目前為止,答案已經忽略了原始問題中的關鍵詞,即“微控制器代碼”。在使用此類代碼編寫代碼以禁用優化時非常常見-積極的優化器將“優化”整個語句,其副作用是控制器。 這與應用程序編碼是一個不同的世界。 對於常規編程領域中的應用程序,我來這里尋找相同的信息,以避免使Kahan求和例程(請參閱Wikipedia)被優化為虛無。 因此,我們不要假設更改優化級別會產生不同的程序行為,這自然是錯誤代碼的標志。 可以巧妙地使用volatile關鍵字來混淆某些內容,並且在某些情況下,應生成實際的匯編語言並進行檢查。 (我相信使用-S切換到gcc仍然可以完成此操作)。 讓我們記住,C旨在成為一種便攜式匯編程序,而不是一種COBOL。

戴夫

除了將功能放在自己的文件中之外,我認為沒有任何方法可以使用較早版本的GCC在功能級別上關閉功能的優化。 但是,您可以嘗試在整個程序中選擇關閉某些類型的優化,而不是關閉此功能的優化。 雖然您已經在此特定功能中發現了一個錯誤,但這可能表示存在其他未發現的錯誤。

正如其他人指出的,罪魁禍首可能是有關“嚴格別名”的優化。 從長遠來看,您可能應該修復有問題的代碼,而從短期來看,您可以在命令行中添加“ -fno-strict-aliasing”。 在-O2或更高級別,編譯器對指針之間的交互進行某些假設。 添加此選項將告訴它不要進行這些假設。

如果失敗,並且由於某種原因無法修復代碼,則可以嘗試禁用其他優化選項

我知道這是舊帖子。 OP給出的GCC頁面實際上說:為了避免優化此類調用,請放置asm(“”); 在功能上。 我想這是一個簡單的解決方法。 只要解決這個問題,希望它可以幫助像我這樣的其他人。

我不能肯定地說,但據我所知,沒有這種可能性。 但是,優化絕不能改變定義良好的代碼的語義。 唯一可能發生的情況是變量被內聯或讀/寫順序被更改。

通過將涉及的變量聲明為volatile可以解決第一個問題,並且可能同時解決這兩個問題,從而向編譯器表明,僅基於程序流程,不應對其內容進行任何假設。

對於仍在使用舊版gcc的用戶:新版gcc解決了此問題。 我已經在gcc-4.5.1中成功使用了它。 祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM