2014-03-18 22:07:45 +00:00
|
|
|
Pull in r196874 from upstream llvm trunk (by Andrew Trick):
|
|
|
|
|
|
|
|
Fix a crash that occurs when PWD is invalid.
|
|
|
|
|
|
|
|
MCJIT needs to be able to run in hostile environments, even when PWD
|
|
|
|
is invalid. There's no need to crash MCJIT in this case.
|
|
|
|
|
|
|
|
The obvious fix is to simply leave MCContext's CompilationDir empty
|
|
|
|
when PWD can't be determined. This way, MCJIT clients,
|
|
|
|
and other clients that link with LLVM don?\226?\128?\153t need a valid working directory.
|
|
|
|
|
|
|
|
If we do want to guarantee valid CompilationDir, that should be done
|
|
|
|
only for clients of getCompilationDir(). This is as simple as checking
|
|
|
|
for an empty string.
|
|
|
|
|
|
|
|
The only current use of getCompilationDir is EmitGenDwarfInfo, which
|
|
|
|
won?\226?\128?\153t conceivably run with an invalid working dir. However, in the
|
|
|
|
purely hypothetically and untestable case that this happens, the
|
|
|
|
AT_comp_dir will be omitted from the compilation_unit DIE.
|
|
|
|
|
2014-05-24 22:27:31 +00:00
|
|
|
Introduced here: http://svnweb.freebsd.org/changeset/base/262611
|
2014-03-18 22:07:45 +00:00
|
|
|
|
|
|
|
Index: include/llvm/MC/MCContext.h
|
|
|
|
===================================================================
|
|
|
|
--- include/llvm/MC/MCContext.h
|
|
|
|
+++ include/llvm/MC/MCContext.h
|
|
|
|
@@ -278,6 +278,7 @@ namespace llvm {
|
|
|
|
/// This can be overridden by clients which want to control the reported
|
|
|
|
/// compilation directory and have it be something other than the current
|
|
|
|
/// working directory.
|
|
|
|
+ /// Returns an empty string if the current directory cannot be determined.
|
|
|
|
StringRef getCompilationDir() const { return CompilationDir; }
|
|
|
|
|
|
|
|
/// \brief Set the compilation directory for DW_AT_comp_dir
|
|
|
|
Index: lib/MC/MCContext.cpp
|
|
|
|
===================================================================
|
|
|
|
--- lib/MC/MCContext.cpp
|
|
|
|
+++ lib/MC/MCContext.cpp
|
|
|
|
@@ -47,8 +47,8 @@ MCContext::MCContext(const MCAsmInfo *mai, const M
|
|
|
|
AllowTemporaryLabels(true), DwarfCompileUnitID(0), AutoReset(DoAutoReset) {
|
|
|
|
|
|
|
|
error_code EC = llvm::sys::fs::current_path(CompilationDir);
|
|
|
|
- assert(!EC && "Could not determine the current directory");
|
|
|
|
- (void)EC;
|
|
|
|
+ if (EC)
|
|
|
|
+ CompilationDir.clear();
|
|
|
|
|
|
|
|
MachOUniquingMap = 0;
|
|
|
|
ELFUniquingMap = 0;
|
|
|
|
Index: lib/MC/MCDwarf.cpp
|
|
|
|
===================================================================
|
|
|
|
--- lib/MC/MCDwarf.cpp
|
|
|
|
+++ lib/MC/MCDwarf.cpp
|
|
|
|
@@ -467,7 +467,8 @@ static void EmitGenDwarfAbbrev(MCStreamer *MCOS) {
|
|
|
|
EmitAbbrev(MCOS, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr);
|
|
|
|
EmitAbbrev(MCOS, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr);
|
|
|
|
EmitAbbrev(MCOS, dwarf::DW_AT_name, dwarf::DW_FORM_string);
|
|
|
|
- EmitAbbrev(MCOS, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string);
|
|
|
|
+ if (!context.getCompilationDir().empty())
|
|
|
|
+ EmitAbbrev(MCOS, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string);
|
|
|
|
StringRef DwarfDebugFlags = context.getDwarfDebugFlags();
|
|
|
|
if (!DwarfDebugFlags.empty())
|
|
|
|
EmitAbbrev(MCOS, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string);
|
|
|
|
@@ -643,8 +644,10 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
|
|
|
|
MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string.
|
|
|
|
|
|
|
|
// AT_comp_dir, the working directory the assembly was done in.
|
|
|
|
- MCOS->EmitBytes(context.getCompilationDir());
|
|
|
|
- MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string.
|
|
|
|
+ if (!context.getCompilationDir().empty()) {
|
|
|
|
+ MCOS->EmitBytes(context.getCompilationDir());
|
|
|
|
+ MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string.
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// AT_APPLE_flags, the command line arguments of the assembler tool.
|
|
|
|
StringRef DwarfDebugFlags = context.getDwarfDebugFlags();
|