2014-10-11 10 views
7

मैं कुछ एलएलवीएम उपकरण (जैसे) स्थिर पुस्तकालयों के रूप में उपयोग कर रहा हूं। अर्थात। मैंने स्रोत llvm-nm.cpp की प्रतिलिपि बनाई, जिसका नाम बदलकर main(..)llvm_nm(..) और इसे स्थिर लाइब्रेरी के रूप में संकलित किया गया। मैं अपनी फाइल में मानक आउटपुट अग्रेषित करना चाहता हूं।llvm :: outs() को फ़ाइल करने के लिए कैसे रीडायरेक्ट करें?

मैं अगले दृष्टिकोण का उपयोग करने की कोशिश की है:

int out_fd, err_fd; 
    fpos_t out_pos, err_pos; 

    // redirect out 
    fflush(stdout); 
    fgetpos(stdout, &out_pos); 
    out_fd = dup(fileno(stdout)); 
    freopen(outFilename, "w", stdout); 

    // execute 
    int ret = llvm_nm(argc_, argv_); 

    // restore output 
    fflush(stdout); 
    dup2(out_fd, fileno(stdout)); 
    close(out_fd); 
    clearerr(stdout); 
    fsetpos(stdout, &out_pos); 

समस्या यह है कि यह अग्रेषित नहीं है (अगर मैं एनएम स्रोत कोड में printf() जोड़ने लेकिन nm उत्पादन के लिए नहीं यह काम करता है)। मैं स्रोत के लिए looke है और मैं देख सकता हूँ llvm::outs() धारा का उपयोग कर उत्पादन किया जाता है:

outs() << "Archive map" << "\n"; 

और it's implemented अगले रास्ता:

/// outs() - This returns a reference to a raw_ostream for standard output. 
00702 /// Use it like: outs() << "foo" << "bar"; 
00703 raw_ostream &llvm::outs() { 
00704 // Set buffer settings to model stdout behavior. 
00705 // Delete the file descriptor when the program exits, forcing error 
00706 // detection. If you don't want this behavior, don't use outs(). 
00707 static raw_fd_ostream S(STDOUT_FILENO, true); 
00708 return S; 
00709 } 

मैं कैसे अनुप्रेषित कर सकते हैं मेरी फाइल करने के लिए है कि उत्पादन?

उत्तर

2

ऐसा करने का एक आसान तरीका प्रतीत नहीं होता है: llvm::raw_fd_ostream में कोई कॉपी/असाइनमेंट कन्स्ट्रक्टर नहीं है और न ही llvm::raw_ostream में। और freopen चाल या तो काम नहीं करती है क्योंकि फ़ाइल descritor पूर्णांक llvm::outs() द्वारा लौटाई गई वस्तु को प्रारंभ करने के लिए उपयोग किया जाता है।

फ्लाई पर llvm::outs() के कार्यान्वयन को बदलने के लिए LD_PRELOAD का उपयोग करने का एकमात्र तरीका है, या समान लिंकर चालें, लेकिन यह मेरे लिए बहुत हैकी लगता है। शायद मूल प्रतीक को कमजोर के रूप में चिह्नित करें और फिर इसे अपनी लाइब्रेरी में ओवरराइड करें?

5

मुझे एहसास है कि यह एक पुराना सवाल है, हालांकि, मैं इसे एलवीएम के बाहरी() स्ट्रीम के लिए कुछ सरल जानकारी देख रहा हूं जिसे मुझे here मिला।

उदाहरण है कि LLVM के साथ आता है में से एक "BrainF" इसे इस तरह का उपयोग करता है:

... 

    raw_ostream *out = &outs(); 
    if (!JIT) { 
    if (OutputFilename == "") { 
     std::string base = InputFilename; 
     if (InputFilename == "-") { base = "a"; } 

     // Use default filename. 
     OutputFilename = base+".bc"; 
    } 
    if (OutputFilename != "-") { 
     std::error_code EC; 
     out = new raw_fd_ostream(OutputFilename, EC, sys::fs::F_None); 
    } 
    } 

    ... 

    if (out != &outs()) 
    delete out; 

    ... 

तो यह पता चलता है कि आप पुनर्निर्देशित करने के लिए सुरक्षित हैं लगता है।

नोट: इस उदाहरण में OutputFilename/InputFilename LLVM के समर्थन लाइब्रेरी CommandLine के साथ बनाया std :: स्ट्रिंग प्रकार हैं।

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