diff --git a/lib/Analysis/Analysis.cpp b/lib/Analysis/Analysis.cpp index 7b6397679d7..907203c571e 100644 --- a/lib/Analysis/Analysis.cpp +++ b/lib/Analysis/Analysis.cpp @@ -86,8 +86,10 @@ LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action, if (Action == LLVMAbortProcessAction && Result) report_fatal_error("Broken module found, compilation aborted!"); - if (OutMessages) - *OutMessages = strndup(MsgsOS.str().data(), MsgsOS.str().size()); + if (OutMessages) { + MsgsOS << '\0'; + *OutMessages = strdup(MsgsOS.str().data()); + } return Result; } diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index bf936d6dc7e..779d8913045 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -62,9 +62,9 @@ void LLVMShutdown() { /*===-- Error handling ----------------------------------------------------===*/ -static char *LLVMCreateMessage(StringRef Message) { - assert(Message.find('\0') == Message.npos); - return strndup(Message.data(), Message.size()); +static char *LLVMCreateMessage(string_ostream &OS) { + OS << '\0'; + return strdup(OS.str().data()); } char *LLVMCreateMessage(const char *Message) { @@ -118,7 +118,7 @@ char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) { string_ostream Msg; DiagnosticPrinterRawOStream DP(Msg); unwrap(DI)->print(DP); - return LLVMCreateMessage(Msg.str()); + return LLVMCreateMessage(Msg); } LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI){ @@ -204,7 +204,7 @@ LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename, char *LLVMPrintModuleToString(LLVMModuleRef M) { string_ostream os; unwrap(M)->print(os, nullptr); - return LLVMCreateMessage(os.str()); + return LLVMCreateMessage(os); } /*--.. Operations on inline assembler ......................................--*/ @@ -282,7 +282,7 @@ char *LLVMPrintTypeToString(LLVMTypeRef Ty) { else os << "Printing Type"; - return strndup(os.str().data(), os.str().size()); + return LLVMCreateMessage(os); } /*--.. Operations on integer types .........................................--*/ @@ -533,7 +533,7 @@ char* LLVMPrintValueToString(LLVMValueRef Val) { else os << "Printing Value"; - return strndup(os.str().data(), os.str().size()); + return LLVMCreateMessage(os); } void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) { diff --git a/lib/IRReader/IRReader.cpp b/lib/IRReader/IRReader.cpp index 6d389d4dc45..e72990751b0 100644 --- a/lib/IRReader/IRReader.cpp +++ b/lib/IRReader/IRReader.cpp @@ -110,7 +110,8 @@ LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, if (OutMessage) { string_ostream os; Diag.print(nullptr, os, false); - *OutMessage = strndup(os.str().data(), os.str().size()); + os << '\0'; + *OutMessage = strdup(os.str().data()); } return 1; }