all of the features in the current working draft of the upcoming C++ standard, provisionally named C++1y. The code generator's performance is greatly increased, and the loop auto-vectorizer is now enabled at -Os and -O2 in addition to -O3. The PowerPC backend has made several major improvements to code generation quality and compile time, and the X86, SPARC, ARM32, Aarch64 and SystemZ backends have all seen major feature work. Release notes for llvm and clang can be found here: <http://llvm.org/releases/3.4/docs/ReleaseNotes.html> <http://llvm.org/releases/3.4/tools/clang/docs/ReleaseNotes.html> MFC after: 1 month
122 lines
3.8 KiB
C++
122 lines
3.8 KiB
C++
//===---- IRReader.cpp - Reader for LLVM IR files -------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/IRReader/IRReader.h"
|
|
#include "llvm/ADT/OwningPtr.h"
|
|
#include "llvm/Assembly/Parser.h"
|
|
#include "llvm/Bitcode/ReaderWriter.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/SourceMgr.h"
|
|
#include "llvm/Support/system_error.h"
|
|
#include "llvm/Support/Timer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm-c/Core.h"
|
|
#include "llvm-c/IRReader.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
extern bool TimePassesIsEnabled;
|
|
}
|
|
|
|
static const char *const TimeIRParsingGroupName = "LLVM IR Parsing";
|
|
static const char *const TimeIRParsingName = "Parse IR";
|
|
|
|
|
|
Module *llvm::getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err,
|
|
LLVMContext &Context) {
|
|
if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
|
|
(const unsigned char *)Buffer->getBufferEnd())) {
|
|
std::string ErrMsg;
|
|
Module *M = getLazyBitcodeModule(Buffer, Context, &ErrMsg);
|
|
if (M == 0) {
|
|
Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
|
|
ErrMsg);
|
|
// ParseBitcodeFile does not take ownership of the Buffer in the
|
|
// case of an error.
|
|
delete Buffer;
|
|
}
|
|
return M;
|
|
}
|
|
|
|
return ParseAssembly(Buffer, 0, Err, Context);
|
|
}
|
|
|
|
Module *llvm::getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err,
|
|
LLVMContext &Context) {
|
|
OwningPtr<MemoryBuffer> File;
|
|
if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) {
|
|
Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
|
|
"Could not open input file: " + ec.message());
|
|
return 0;
|
|
}
|
|
|
|
return getLazyIRModule(File.take(), Err, Context);
|
|
}
|
|
|
|
Module *llvm::ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err,
|
|
LLVMContext &Context) {
|
|
NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName,
|
|
TimePassesIsEnabled);
|
|
if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
|
|
(const unsigned char *)Buffer->getBufferEnd())) {
|
|
std::string ErrMsg;
|
|
Module *M = ParseBitcodeFile(Buffer, Context, &ErrMsg);
|
|
if (M == 0)
|
|
Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
|
|
ErrMsg);
|
|
// ParseBitcodeFile does not take ownership of the Buffer.
|
|
delete Buffer;
|
|
return M;
|
|
}
|
|
|
|
return ParseAssembly(Buffer, 0, Err, Context);
|
|
}
|
|
|
|
Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err,
|
|
LLVMContext &Context) {
|
|
OwningPtr<MemoryBuffer> File;
|
|
if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) {
|
|
Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
|
|
"Could not open input file: " + ec.message());
|
|
return 0;
|
|
}
|
|
|
|
return ParseIR(File.take(), Err, Context);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// C API.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef,
|
|
LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
|
|
char **OutMessage) {
|
|
SMDiagnostic Diag;
|
|
|
|
*OutM = wrap(ParseIR(unwrap(MemBuf), Diag, *unwrap(ContextRef)));
|
|
|
|
if(!*OutM) {
|
|
if (OutMessage) {
|
|
std::string buf;
|
|
raw_string_ostream os(buf);
|
|
|
|
Diag.print(NULL, os, false);
|
|
os.flush();
|
|
|
|
*OutMessage = strdup(buf.c_str());
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|