mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
Add basic error checking to MemoryBuffer::getSTDIN.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104855 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -89,7 +89,8 @@ public:
|
|||||||
StringRef BufferName = "");
|
StringRef BufferName = "");
|
||||||
|
|
||||||
/// getSTDIN - Read all of stdin into a file buffer, and return it.
|
/// getSTDIN - Read all of stdin into a file buffer, and return it.
|
||||||
static MemoryBuffer *getSTDIN();
|
/// If an error occurs, this returns null and fills in *ErrStr with a reason.
|
||||||
|
static MemoryBuffer *getSTDIN(std::string *ErrStr = 0);
|
||||||
|
|
||||||
|
|
||||||
/// getFileOrSTDIN - Open the specified file as a MemoryBuffer, or open stdin
|
/// getFileOrSTDIN - Open the specified file as a MemoryBuffer, or open stdin
|
||||||
|
@ -160,16 +160,17 @@ bool Linker::LinkInFile(const sys::Path &File, bool &is_native) {
|
|||||||
// Check for a file of name "-", which means "read standard input"
|
// Check for a file of name "-", which means "read standard input"
|
||||||
if (File.str() == "-") {
|
if (File.str() == "-") {
|
||||||
std::auto_ptr<Module> M;
|
std::auto_ptr<Module> M;
|
||||||
MemoryBuffer *Buffer = MemoryBuffer::getSTDIN();
|
if (MemoryBuffer *Buffer = MemoryBuffer::getSTDIN(&Error)) {
|
||||||
if (!Buffer->getBufferSize()) {
|
if (!Buffer->getBufferSize()) {
|
||||||
delete Buffer;
|
delete Buffer;
|
||||||
Error = "standard input is empty";
|
Error = "standard input is empty";
|
||||||
} else {
|
} else {
|
||||||
M.reset(ParseBitcodeFile(Buffer, Context, &Error));
|
M.reset(ParseBitcodeFile(Buffer, Context, &Error));
|
||||||
delete Buffer;
|
delete Buffer;
|
||||||
if (M.get())
|
if (M.get())
|
||||||
if (!LinkInModule(M.get(), &Error))
|
if (!LinkInModule(M.get(), &Error))
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return error("Cannot link stdin: " + Error);
|
return error("Cannot link stdin: " + Error);
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ MemoryBuffer *MemoryBuffer::getFileOrSTDIN(StringRef Filename,
|
|||||||
int64_t FileSize,
|
int64_t FileSize,
|
||||||
struct stat *FileInfo) {
|
struct stat *FileInfo) {
|
||||||
if (Filename == "-")
|
if (Filename == "-")
|
||||||
return getSTDIN();
|
return getSTDIN(ErrStr);
|
||||||
return getFile(Filename, ErrStr, FileSize, FileInfo);
|
return getFile(Filename, ErrStr, FileSize, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +263,7 @@ public:
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryBuffer *MemoryBuffer::getSTDIN() {
|
MemoryBuffer *MemoryBuffer::getSTDIN(std::string *ErrStr) {
|
||||||
char Buffer[4096*4];
|
char Buffer[4096*4];
|
||||||
|
|
||||||
std::vector<char> FileData;
|
std::vector<char> FileData;
|
||||||
@ -279,6 +279,11 @@ MemoryBuffer *MemoryBuffer::getSTDIN() {
|
|||||||
FileData.insert(FileData.end(), Buffer, Buffer+ReadBytes);
|
FileData.insert(FileData.end(), Buffer, Buffer+ReadBytes);
|
||||||
} while (ReadBytes == sizeof(Buffer));
|
} while (ReadBytes == sizeof(Buffer));
|
||||||
|
|
||||||
|
if (!feof(stdin)) {
|
||||||
|
if (ErrStr) *ErrStr = "error reading from stdin";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
FileData.push_back(0); // &FileData[Size] is invalid. So is &*FileData.end().
|
FileData.push_back(0); // &FileData[Size] is invalid. So is &*FileData.end().
|
||||||
size_t Size = FileData.size();
|
size_t Size = FileData.size();
|
||||||
MemoryBuffer *B = new STDINBufferFile();
|
MemoryBuffer *B = new STDINBufferFile();
|
||||||
|
@ -2205,15 +2205,14 @@ LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
|
|||||||
|
|
||||||
LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
|
LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
|
||||||
char **OutMessage) {
|
char **OutMessage) {
|
||||||
MemoryBuffer *MB = MemoryBuffer::getSTDIN();
|
std::string Error;
|
||||||
if (!MB->getBufferSize()) {
|
if (MemoryBuffer *MB = MemoryBuffer::getSTDIN(&Error)) {
|
||||||
delete MB;
|
*OutMemBuf = wrap(MB);
|
||||||
*OutMessage = strdup("stdin is empty.");
|
return 0;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*OutMemBuf = wrap(MB);
|
*OutMessage = strdup(Error.c_str());
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
|
void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
|
||||||
|
Reference in New Issue
Block a user