2012-02-08 41 views
8

Có cách nào để lấy danh sách các hàm KHÔNG được gạch chân ở bất kỳ đâu không? Hoặc bằng cách chuyển một tùy chọn tới gcc hoặc bằng cách kiểm tra nhị phân?Cách tìm ra các hàm nào KHÔNG được gạch chân

EDIT: Tôi biết cách yêu cầu rõ ràng một hàm không được gạch chân bằng cách sử dụng thuộc tính nội tuyến dựng sẵn của gcc.

Trả lời

3

Sử dụng gcc's -fdump-tree-all và tìm kiếm tệp kết xuất cho "nội tuyến".

0

Bạn có thể sử dụng nm command trong Unix/Linux để nhận danh sách biểu tượng trong nhị phân.
Nếu chức năng không được gạch chân, tên biểu tượng của nó sẽ xuất hiện trong phần nhị phân.

+5

Điều đó không chính xác. Các chức năng không tĩnh sẽ được phát ra bất kể chúng có được inline hay không. – Mat

+0

@Mat, no. Mô hình nội tuyến cho C++ có lẽ phức tạp hơn một chút, nhưng đối với C (C99 và C11), ký hiệu chỉ được phát ra trong một đơn vị dịch có yêu cầu "tức thời" của ký hiệu, nghĩa là C có định nghĩa * nội tuyến * và một tuyên bố bên ngoài. –

+0

@Als, +1, nhưng bạn có thể chính xác hơn một chút. Một tên biểu tượng có thể có mặt như một biểu tượng không xác định hoặc để xác định biểu tượng. Có hay không nó định nghĩa biểu tượng phụ thuộc nhiều vào các mô hình instantiation, tôi nghĩ rằng chúng có thể khá khác nhau trong việc thực hiện C++ khác nhau (kiến thức của tôi về C++ ở đây là một chút gỉ) và trong C. –

0

'nội tuyến' KHÔNG phải là thuộc tính của hàm, hàm có thể vừa được inlined vừa không được gạch chân. khi bạn gọi một hàm, trình biên dịch quyết định xem có nội tuyến hay không, nếu có nhiều cuộc gọi, trình biên dịch có thể chọn tùy chọn khác nhau cho các cuộc gọi khác nhau. nếu có ít nhất một cuộc gọi không được nội tuyến, hàm sẽ xuất hiện trong bảng biểu tượng. và nếu nó được xuất, nó cũng sẽ xuất hiện trong bảng biểu tượng.

do đó không có cách nào để kiểm tra chức năng có được gạch chân hay không, bạn chỉ có thể kiểm tra cuộc gọi cụ thể được nội tuyến hoặc không được thiết kế ngược lại.

+0

Tôi hiểu nội tuyến là "cho mỗi cuộc gọi", câu hỏi của tôi là làm thế nào để tìm hiểu xem TẤT CẢ các cuộc gọi không được gạch chân. –

+1

Bạn không trả lời câu hỏi. –

5

Thêm -fdump-ipa-inline vào tùy chọn trình biên dịch của bạn.

Cắt tệp yoursourcefile.inline được tạo bên cạnh tệp đối tượng cho "Xem xét ứng viên nội tuyến" để tìm hiểu tất cả các hàm mà trình biên dịch xem là nội tuyến.

Cắt tệp cho "Được đưa vào" để tìm hiểu tất cả các hàm mà trình biên dịch cuối cùng là đã thực hiện nội tuyến.
Grep cho "inline_failed:" nếu bạn quan tâm vì lý do trình biên dịch đã từ chối một ứng cử viên (ví dụ: "không thể gọi và kích thước mã sẽ tăng").

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