2012-12-18 13 views
5

अब मैं क्लैंग का उपयोग अपनी .c फ़ाइल को .s फ़ाइल में बनाता हूं। और मैंने एलएलएमएम एपीआई का उपयोग आईआर संशोधित किया है। हालांकि, अब मैं अपनी संशोधित आईआर को फाइल में सहेज नहीं सकता। मैं "LLVMWriteBitcodeToFile" का उपयोग करना चाहता हूं, लेकिन मुझे "LLVMOpaqueModule" की संरचना नहीं मिल रही है; मैं "WriteBitcodeToFile" का उपयोग करना चाहता हूं, यह हमेशा मुझे "टाइप मिस्चैच" दिखाता है। और मैं यह भी जानना चाहता हूं कि निष्पादन योग्य फ़ाइल में आईआर फ़ाइल कैसे बनाएं।आईआर को फ़ाइल में कैसे सहेजना है और इसे निष्पादन योग्य फ़ाइल में कैसे बनाया जाए?

अगला दो तरीके हैं मैं एक मॉड्यूल को बचाने के लिए उपयोग करें:

1, सबसे पहले उपयोग WriteBitcodeToFile

bool unbuffered = false; 
llvm::raw_ostream ro(unbuffered); 
WriteBitcodeToFile(m, ro); 

2, दूसरा उपयोग LLVMWriteBitcodeToFile

const char *Path = "hello2.s"; 
int ans = LLVMWriteBitcodeToFile(m, Path); 

ध्यान दें: मीटर का एक मुद्दा है मॉड्यूल इंस्टेंस

+0

उपयोग करने के लिए सही फ़ंक्शन वास्तव में 'बिटकोड/रीडरवाइटर.h' से 'WriteBitcodeToFile' है। यदि आप इसका उपयोग करने में विफल रहते हैं, तो आपको वह कोड प्रदान करना चाहिए जिसे आप इस प्रश्न में संकलित करने का प्रयास कर रहे हैं। – Oak

+0

हाँ, का पालन WriteBitcodeToFilevoid के प्रोटोटाइप है: WriteBitcodeToFile (स्थिरांक मॉड्यूल * एम, raw_ostream &Out); –

+0

हाँ, का पालन WriteBitcodeToFilevoid के प्रोटोटाइप है: WriteBitcodeToFile (स्थिरांक मॉड्यूल * एम, raw_ostream &Out); जब मैं एक raw_stream init, मैं एक वहन नहीं कर सकते ।। प्रकार मैच पैरामीटर जो एक डिफॉल्ट पैरामीटर है –

उत्तर

3
  1. आईआर को एक फाइल में सहेजने के लिए, इस प्रश्न का उत्तर देखें: writing module to .bc bitcode file
  2. किसी ऑब्जेक्ट फ़ाइल में आईआर संकलित करने के लिए, llc टूल देखें और उसका main फ़ंक्शन क्या करता है उसका पालन करें।
+0

धन्यवाद, लेकिन जब मैं raw_ostream का उदाहरण देता हूं जो WriteBitcodeToFile का पैरामीटर है, तो मैं ' यह मत करो। कोई संकेत नहीं पैरामीटर, न ही मिस्चैच टाइप करें। –

+0

और दूसरा मुझे याद है कि llc सिर्फ आईआर को असेंबली बनने के लिए, हम सिर्फ मंच आवंटित कर सकते हैं। –

+0

अगला दो विधियां हैं जिनका उपयोग मैं मॉड्यूल को सहेजने के लिए करता हूं: bool unbuffered = false; llvm :: raw_ostream ro (unbuffered); WriteBitcodeToFile (एम, ro); \t \t कॉन्स char * पथ = "hello2.s"; int ans = LLVMWriteBitcodeToFile (एम, पथ); –

0

इन कार्यों चेक बाहर llvm-c/TargetMachine.h में:

/** Emits an asm or object file for the given module to the filename. This 
    wraps several c++ only classes (among them a file stream). Returns any 
    error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 
    char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 

/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 
LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 
    LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf); 

भी देखें How to generate machine code with llvm

1

दायर करने के लिए मैं क्या कर LLVM bitcode लिखने के लिए है:

std::error_code EC; 
llvm::raw_fd_ostream OS("module", EC, llvm::sys::fs::F_None); 
WriteBitcodeToFile(pBiFModule, OS); 
OS.flush(); 

और फिर LLVM का उपयोग कर एकत्रित न -dis।

संबंधित मुद्दे