কীভাবে এলএলভিএম আইআর-র ঝাঁকুনি সংকলন করা যায়


150

আমি বাইনারি এক্সিকিউটেবলের চেয়ে বাইকোডে আমার C/C++কোডটি সংকলন করতে চাই ng LLVMআমি কীভাবে এটি অর্জন করতে পারি? এবং যদি আমি পাইLLVM বাইকোড কীভাবে এটি আরও বাইনারি এক্সিকিউটেবলের মধ্যে সংকলন করতে পারি।

মূলত আমি LLVMবাইনারি এক্সিকিউটেবলকে সংকলন করার আগে বাইটকোডে নিজের কিছু কোড যুক্ত করতে চাই ।


আমার ধারণা, এটিকে এলএলভিএম বিটকোড বলা হয়
প্রি জ্যাকি

উত্তর:


204

কিছু সি / সি ++ ফাইল দেওয়া হয়েছে foo.c:

> clang -S -emit-llvm foo.c

উত্পাদিত হয় foo.llযা একটি এলএলভিএম আইআর ফাইল।

-emit-llvmবিকল্পটি মাধ্যমে সরাসরি কম্পাইলার ফ্রন্ট-এন্ড প্রেরণ করা যেতে পারে, এবং চালক -cc1:

> clang -cc1 foo.c -emit-llvm

foo.llআইআর দিয়ে উত্পাদন করে। -cc1কিছু দুর্দান্ত বিকল্প যুক্ত করুন -ast-print। পরীক্ষা করে দেখুন -cc1 --helpআরো বিস্তারিত জানার জন্য।


অ্যাসেমব্লিতে আরও এলএলভিএম আইআর সংকলন করতে, llcসরঞ্জামটি ব্যবহার করুন :

> llc foo.ll

foo.sসমাবেশ সহ উত্পাদন করে (আপনি যে মেশিন আর্কিটেকচারটি চালিত করেন তাতে ডিফল্ট করে)। llcএলএলভিএম সরঞ্জামগুলির মধ্যে একটি - এটির ডকুমেন্টেশন এখানে


7
এখানে কি করে?
meawoppl

13
@ মাওওপিপিএল: -জিসি-র মতো এস-র মত বলেছেন, একত্রিত বাইনারি না করে পাঠ্য সমাবেশে
ইমিট নির্ধারণ করুন

Ahha। এটি সম্পর্কে ডক্সে কিছু খুঁজে পেতে আমার খুব কষ্ট হচ্ছিল। এটা ধরে নেওয়া নিরাপদ যে ঝাঁকুনি মিরর জিসিসি পতাকা কাঠামোতে অনেকগুলি পতাকা?
meawoppl

@ এলিবেেন্ডারস্কি আপনি কি জানেন যে কীভাবে একাধিক .c এবং .h ফাইলগুলি একটি মানব পাঠযোগ্য IR তে সংকলন করতে হয় যাতে আমি 'lli theIrFile' ব্যবহার করে IR চালাতে পারি? ধন্যবাদ
ক্যাশে

1
@ ক্যাশে: প্রত্যেককে তার নিজস্ব আইআর ফাইলের মধ্যে সংকলন করুন এবং তারপরে এলএলভিএম লিংক ব্যবহার করুন
এলি বেন্ডারস্কি

20

ব্যবহার

clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc

9
আমি এক্সটেনশনের অর্থ অক্ষত রাখার পরামর্শ দেব। আইওডাব্লু, .oবাইনারি অবজেক্ট ফাইলগুলি, .sঅ্যাসেম্বলি ফাইলগুলিতে এবং .llএলএলভিএম আইআর ফাইলগুলিতে অন্য কিছু (কনভেনশন দ্বারা ) উল্লেখ করা উচিত । অন্যথায় বিভ্রান্ত হওয়া সহজ। ব্লেয়ার / এলএলভিএমের বাইনারি অবজেক্টগুলির জন্য এখন তাদের নিজস্ব কোনও লিঙ্কার নেই (যদিও এটির কাজ চলছে)। এলএলভিএম লিঙ্কার llvm-ldকেবল একটিতে বেশ কয়েকটি আইআর ফাইলগুলিতে যোগদান করে
এলি বেন্ডারস্কি

1
@ এলিবেেন্ডারস্কি: আপনি যেখানে ফাইল এক্সটেনশনের সাথে সম্পর্কিত তা সঠিক - এবং ঝনঝন সামনের অংশটি .bcব্যবহার করা হলে প্রকৃতপক্ষে সঠিক কাজটি করে ; এছাড়াও, মনে রাখবেন যে llvm-ldসিস্টেম টুলচেনের সামনের অংশ হিসাবে কাজ করতে পারে, অর্থাৎ আমার পূর্ববর্তী উত্তরটি llvm-ld -nativeপ্রত্যাশা অনুযায়ী কাজ করা উচিত ....
ক্রিস্টোফ

1
@rickfoosusa: আমার জন্য কাজ করে - foo.bcএকটি LLVM bitcode ফাইল
ক্রিস্টোফ

1
আমার জন্য কাজ করে: clang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode
এনটিসি 2

18

আপনার যদি একাধিক উত্স ফাইল থাকে তবে আপনি সম্ভবত পুরো প্রোগ্রামটির জন্য একটি বিটকোড ফাইল আউটপুট দিতে লিংক-টাইম-অপ্টিমাইজেশন ব্যবহার করতে চান। প্রদত্ত অন্যান্য উত্তরগুলি আপনাকে প্রতিটি উত্স ফাইলের জন্য একটি বিটকোড ফাইল দিয়ে শেষ করবে cause

পরিবর্তে, আপনি লিঙ্ক-সময়-অপ্টিমাইজেশান সঙ্গে সংকলন করতে চান

clang -flto -c program1.c -o program1.o
clang -flto -c program2.c -o program2.o

এবং চূড়ান্ত সংযোগের পদক্ষেপের জন্য -Wl, -plugin-opt = also-emit-llvm যুক্তি যুক্ত করুন

clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program

এটি আপনাকে একটি সংকলিত প্রোগ্রাম এবং বিটকোড উভয়ই সরবরাহ করে (প্রোগ্রাম.বিসি)। আপনি তারপরে যেকোন সময় প্রোগ্রাম.বিসি পরিবর্তন করতে পারেন এবং যে কোনও সময় সংশোধিত প্রোগ্রামটি পুনরায় সংকলন করতে পারেন

clang program.bc -o program

যদিও সচেতন থাকুন যে আপনাকে এই ধাপে আবার কোনও প্রয়োজনীয় লিঙ্কার পতাকা (বাইরের লাইব্রেরি ইত্যাদির জন্য) অন্তর্ভুক্ত করতে হবে।

নোট করুন যে এটি কাজ করার জন্য আপনাকে সোনার লিঙ্কার ব্যবহার করা উচিত। যদি আপনি ঝাঁকুনিকে কোনও নির্দিষ্ট লিঙ্কার ব্যবহার করতে বাধ্য করতে চান, তবে আপনার কম্পিউটারে কোথাও "ফেকবিন" নামে একটি বিশেষ ডিরেক্টরিতে "এলডি" নামের সেই লিঙ্কারের সাথে একটি সিমিলিংক তৈরি করুন এবং বিকল্পটি যুক্ত করুন

-B/home/jeremy/fakebin

উপরের যে কোনও সংযোগের পদক্ষেপে।


13

আপনার যদি একাধিক ফাইল থাকে এবং আপনি প্রতিটি ফাইল টাইপ করতে না চান তবে আমি আপনাকে সুপারিশ করব যে আপনি এই সাধারণ পদক্ষেপগুলি অনুসরণ করুন (আমি ব্যবহার করছি clang-3.8তবে আপনি অন্য কোনও সংস্করণ ব্যবহার করতে পারেন):

  1. সমস্ত .llফাইল উত্পন্ন

    clang-3.8 -S -emit-llvm *.c
  2. তাদের একক সাথে লিঙ্ক করুন

    llvm-link-3.8 -S -v -o single.ll *.ll
  3. (Ptionচ্ছিক) আপনার কোডটি অপ্টিমাইজ করুন (সম্ভবত কিছু উপরি বিশ্লেষণ)

    opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
  4. সমাবেশ উত্পন্ন করুন (একটি optimised.sফাইল উত্পন্ন করে )

    llc-3.8 optimised.ll
  5. এক্সিকিউটেবল (নামযুক্ত a.out) তৈরি করুন

    clang-3.8 optimised.s

আপনার সমাধানটি বেশ অনন্য: আপনি কেবল বাইনারি আউটপুট হিসাবে রেখে দেওয়ার পরিবর্তে "-S" ব্যবহার করেছেন। "-S" থাকা এবং "-S" না থাকার মধ্যে কি কোনও পার্থক্য রয়েছে?
পিটার টেওহ

@ পিটারটিওহ আমি -Sঅপশনটি ব্যবহার করি (দ্বিতীয় ধাপে), আমি উল্লেখ করেছি যে আমি এলএলভিএম আইআর এর আউটপুট উত্পাদন করতে চাই। মূলত, সমস্ত * .ll ফাইল একক একটিতে রাখুন। অপ্টিমাইজেশনগুলি কোডটি আসলেই বদলে দেয় তা পরীক্ষা করার জন্য আমি এটি করি, অর্থাত্ এখন আলাদা (কোড-ভিত্তিক) হওয়া উচিত single.llএবং optimised.llকোনও পার্থক্য আছে কি না তা দেখতে আপনিও প্রতিবেদনটি প্রদর্শন করতে পারেন।
কিকো ফার্নান্দেজ

-basicaaaএটি একটি ভুল পতাকা, -basicaaপরিবর্তে অবশ্যই ব্যবহার করা উচিত।
অ্যান্টন_আরহ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.