2008-12-27 28 views
12

Có thể tắt tối ưu hóa chức năng cụ thể không? Một người bạn của tôi có vấn đề là tối ưu hóa gcc làm cho một số (không biết tôi) mã µ-controller-không hoạt động. Chúng ta biết đó là chức năng nào, nhưng chúng ta không có đầu mối của chính mã đó để cách dễ nhất và an toàn nhất có thể là chỉ cần tắt nó đi cho toàn bộ hàm.Tắt tối ưu hóa cho một chức năng cụ thể trong gcc 4.2.2

Đáng buồn là http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html cho thấy rằng có thuộc tính chức năng tối ưu hóa/pragma, nhưng yêu cầu gcc 4.4 mà chúng tôi không có.

cảm ơn trước

+2

tại sao không sửa mã thay vì cố gắng khắc phục cảnh báo? –

+0

GCC 4.3.2 là phiên bản phát hành mới nhất của GA, vì vậy không có gì đáng ngạc nhiên khi bạn không có GCC 4.4. Thông tin bạn cung cấp thật thú vị - cảm ơn. –

Trả lời

12

Nếu pragma không hoạt động cho bạn, hãy thử tách chức năng thành tệp riêng của nó, và sau đó biên dịch tệp đó mà không đặt cờ tối ưu.

3

Tôi không thể nói chắc chắn nhưng theo như tôi biết, không có khả năng như vậy. Tuy nhiên, tối ưu hóa không bao giờ nên thay đổi ngữ nghĩa của một mã được xác định rõ ràng. Điều duy nhất có thể xảy ra ở đây là một biến được inlined hoặc thứ tự đọc/ghi được thay đổi.

Đầu tiên, và có thể cả hai vấn đề có thể được giải quyết bằng cách tuyên bố (các) biến có liên quan là volatile, do đó hiển thị trình biên dịch không được giả định về nội dung của nó.

+0

Tôi đã xem xét điều này, nó sẽ là tốt đẹp để có nó như là một thuộc tính chức năng hoặc một cái gì đó tương tự. Cảm ơn –

7

Bạn có thể đặt hàm trong một tệp riêng biệt và biên dịch tệp đó mà không cần tối ưu hóa nhưng giải pháp tốt hơn là tìm ra những gì sai với mã và sửa nó.

Một trong những lỗi phổ biến nhất xuất hiện khi tối ưu hóa được bật với gcc là với bí danh nghiêm ngặt. Đảm bảo tất cả cảnh báo được bật và xem bạn có nhận được bất kỳ cảnh báo nào có thể giúp bạn tìm ra vấn đề là gì không. Nếu bạn không thể tìm ra, hãy cố gắng giảm bớt vấn đề cho một chương trình nhỏ, hoàn chỉnh và đăng nó ở đây.

4

Ngắn đưa hàm vào tệp riêng của nó, tôi không nghĩ có cách nào để tắt tối ưu hóa trên một hàm theo cấp chức năng sử dụng phiên bản trước của GCC. Nhưng thay vì tắt tối ưu hóa cho chức năng này, bạn có thể thử chọn tắt một số loại tối ưu hóa nhất định trong toàn bộ chương trình. Trong khi bạn đã xác định một lỗi trong hàm cụ thể này, điều này có thể chỉ ra sự tồn tại của các lỗi chưa được khám phá khác.

Như những người khác đã chỉ ra, có khả năng thủ phạm là tối ưu hóa về 'strict aliasing'. Trong khi về lâu dài bạn có thể nên sửa mã trong câu hỏi, trong ngắn hạn bạn có thể chơi với thêm '-fno-strict-aliasing' vào dòng lệnh của bạn. Tại -O2 và cao hơn, trình biên dịch đưa ra các giả định nhất định về tương tác giữa các con trỏ. Việc thêm tùy chọn này sẽ không cho phép thực hiện các giả định này.

Nếu điều này không thành công và nếu vì lý do nào đó mã không thể sửa được, bạn có thể thử vô hiệu hóa optimization options khác.

5

Câu trả lời cho đến nay đã bỏ qua các từ khóa trong câu hỏi ban đầu, đó là "mã vi điều khiển" Điều này rất phổ biến khi viết mã như vậy để vô hiệu hóa các tối ưu hóa. hiệu ứng phụ là điều khiển bộ điều khiển. Đây là một thế giới khác với ứng dụng mã hóa . Đối với một ứng dụng trong không gian thông thường của chương trình, tôi đến đây tìm kiếm cho cùng một thông tin để tránh có một thói quen cho tổng kết Kahan (xem wikipedia) tối ưu hóa vào hư vô.Vì vậy, chúng ta không giả định rằng một sự thay đổi của mức độ tối ưu hóa tạo ra hành vi chương trình khác nhau tự động là một dấu hiệu của mã xấu. Những điều có thể được kludged bằng cách sử dụng các từ khóa dễ bay hơi khéo léo, và trong một số trường hợp ta nên tạo ra ngôn ngữ lắp ráp thực tế và kiểm tra nó. (Tôi tin rằng điều này vẫn có thể được thực hiện với chuyển đổi -S thành gcc). Hãy nhớ rằng C được dự định là một loại lắp ráp di động, không phải là một loại COBOL.

Dave

3

Tôi biết đây là một bài đăng cũ. Trang GCC mà OP thực sự cho biết: Để giữ cho các cuộc gọi như vậy không bị tối ưu hóa, hãy đặt asm (""); trong hàm. Tôi đoán đây là cách giải quyết dễ dàng. Chỉ cần tốt điều này, hy vọng nó có thể giúp đỡ những người khác như tôi.

2

Đối với những người vẫn đang sử dụng phiên bản gcc cũ hơn: Phiên bản mới hơn của gcc giải quyết được sự cố này. Tôi đã sử dụng thành công điều này trong gcc-4.5.1. Goodluck.

+1

Vui lòng cho biết cách thực hiện với phiên bản đó. – user2284570

Các vấn đề liên quan