2011-01-08 32 views
12

Có thể chạy trình biên dịch LLVM với đầu vào của mã x86 32 bit không? Có một thuật toán rất lớn mà tôi không có mã nguồn và tôi muốn làm cho nó chạy nhanh hơn trên cùng một phần cứng. Tôi có thể dịch nó từ x86 trở lại x86 với tối ưu hóa không.Biên dịch lại mã x86 bằng LLVM sang một số nhanh hơn x86

Mã này chạy một thời gian dài, vì vậy tôi muốn làm lại biên dịch tĩnh của nó. Ngoài ra, tôi có thể làm một hồ sơ thời gian chạy của nó và đưa ra gợi ý LLVM, mà chi nhánh có nhiều khả năng hơn.

Mã gốc được viết cho x86 + x87 và không sử dụng SSE/MMX/SSE2. Sau khi biên dịch lại Nó có cơ hội sử dụng x86_64 và/hoặc SSE3. Ngoài ra, mã sẽ được tái tạo theo cách tối ưu hơn cho bộ giải mã phần cứng.

Cảm ơn.

+1

Đây không phải là câu trả lời, nhưng tôi nhớ đã có các chương trình cho Amiga để "tối ưu" mã được biên dịch cho MC68000 để làm cho nó hoạt động nhanh hơn trên các bộ vi xử lý mới hơn, với chi phí tương thích. Nhưng tôi biết không có nỗ lực như vậy cho x86. – liori

+0

IMO, bạn có thể có một thời gian tốt hơn bằng cách sử dụng một cái gì đó như IDA & hex-quang hoặc Ollydbg để đảo ngược kỹ sư lắp ráp trở lại vào một ngôn ngữ cấp cao hơn (C hoặc C++) – Necrolis

+1

[RevGen] (http://stackoverflow.com/questions/ 9359487/the-source-code-of-revgen-tool) là một trong những trình dịch x86-> LLVM tại đây. Nó cũng có dịch từ x86 đến nhị phân tĩnh. Nó sử dụng Qemu và sửa đổi MIPS TCG, tạo ra IR. – osgx

Trả lời

10

LLVM không thể thực hiện việc này ra khỏi hộp. Bạn sẽ phải viết một x86 nhị phân để LLVM trung gian đại diện (IR) chuyển đổi. Đó sẽ là một nhiệm vụ rất nhỏ nhặt. Nếu mã x86 đủ đơn giản, nó có thể ánh xạ khá gần với IR, nhưng một số lệnh x86 sẽ không ánh xạ trực tiếp, ví dụ: stack pointer manipulations.

Chỉnh sửa: Bạn cũng có thể xem xét thử cách tiếp cận tương tự với những gì QEMU thực hiện. QEMU dịch các tập tin nhị phân một cách nhanh chóng, khi nó chạy mã PowerPC, mỗi khối cơ bản được dịch sang mã X86 trước khi nó được thực thi. Bạn có thể tìm ra cách để phá vỡ tập tin đối tượng của bạn vào các khối cơ bản và tạo LLVM IR cho mỗi khối, loại bỏ các thứ (như tham số truyền, vv) và thay thế bằng LLVM IR thẳng.

Vẫn là một công việc LỚN. Có lẽ dễ dàng hơn để viết lại thuật toán từ đầu.

quá trình chính xác này được mô tả trong "Dynamically Translating x86 to LLVM using QEMU"

+0

Có dự án nào để làm giống nhau không? – osgx

+0

Không có khả năng. Chỉ đơn giản là không có đủ thông tin còn lại trong mã máy cho trình tối ưu hóa của LLVM để làm việc. Mã sẽ phải được thiết kế ngược trở lại một đại diện cấp cao trước khi nó có thể được vectorized và biên dịch lại một cách hữu ích cho 64bit, và các trình biên dịch không phải là tốt khi đưa ra suy luận. Bạn có thể sử dụng trình mô phỏng x86 có khả năng biên dịch lại động, nhưng nó không có khả năng để vector hóa toán học, và chi phí trên sẽ phủ nhận bất kỳ mức tăng hiệu năng nào. – user57368

+0

Đối với chi phí: Có một số mã mà tôi muốn chạy nhanh. Tôi có thể dành 1 giờ chạy trình tối ưu hóa trước khi tôi chạy mã mới. Mục tiêu - là lấy mã nhanh hơn từ thời gian chậm hơn. Quá trình biên dịch lại phải được thực hiện tĩnh, một lần. – osgx

1

Các MAO project dường như làm một phần của những gì bạn muốn (x86-> ngôn ngữ trung gian).

chỉnh sửa: @osgx, bạn sẽ cần phải xem trang web mao để biết trạng thái dự án và chi tiết về chương trình nào họ có thể xử lý. (Mã tự sửa đổi có thể là một thách thức.)

+1

Xin chào. Trạng thái của MAO là gì? Phần nào của x86/x86_64 có thể xử lý? Nó có thể hoạt động với mã tự sửa đổi (được đóng gói UPX, ví dụ) chỉ cần phiên dịch – osgx

0

Từ những gì tôi biết, việc tách mã x86 chính xác 100% là không thể. Vì dữ liệu và mã được xen kẽ và cũng do hướng dẫn độ dài thay đổi. Cách duy nhất để tháo rời đúng cách là diễn giải nó một cách nhanh chóng.

+0

để tự sửa đổi mã. Mã tĩnh có thể được tháo rời dễ dàng (với bất kỳ bộ tách rời nào). Làm việc với mã động chỉ có thể nếu sẽ có một trình biên dịch lại khi chạy HOẶC nếu mã động có thể được giải nén thành mã tĩnh (trong trường hợp của tôi EXE được đóng gói giống như UPX được sử dụng và nó có thể được giải nén) – osgx

+0

@osgx: không đúng. Ví dụ, kỹ thuật desynchronization có thể dễ dàng nhầm lẫn disassemblers. – molnarg

+0

Vâng, về mặt kỹ thuật, đó là sự thật, nhưng không có gì đáng giá kỹ thuật là bao giờ hết 100% có thể. vì vậy trong lý thuyết, 100%? không bao giờ có thể ... trên thực tế, 99,98% rất có thể ... trên thực tế nó được ghi chép rõ ràng về cách bạn vượt qua các giới hạn lý thuyết và tạo ra đầu ra có giá trị. – TechZilla

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