mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Restore "[ThinLTO] Serialize the Module SourceFileName to/from LLVM assembly"
This restores commit 264869, with a fix for windows bots to properly escape '\' in the path when serializing out. Added test. llvm-svn: 264884
This commit is contained in:
parent
adf292b0b4
commit
caec55026e
@ -533,6 +533,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
|||||||
KEYWORD(notail);
|
KEYWORD(notail);
|
||||||
KEYWORD(target);
|
KEYWORD(target);
|
||||||
KEYWORD(triple);
|
KEYWORD(triple);
|
||||||
|
KEYWORD(source_filename);
|
||||||
KEYWORD(unwind);
|
KEYWORD(unwind);
|
||||||
KEYWORD(deplibs); // FIXME: Remove in 4.0.
|
KEYWORD(deplibs); // FIXME: Remove in 4.0.
|
||||||
KEYWORD(datalayout);
|
KEYWORD(datalayout);
|
||||||
|
@ -239,6 +239,10 @@ bool LLParser::ParseTopLevelEntities() {
|
|||||||
case lltok::kw_define: if (ParseDefine()) return true; break;
|
case lltok::kw_define: if (ParseDefine()) return true; break;
|
||||||
case lltok::kw_module: if (ParseModuleAsm()) return true; break;
|
case lltok::kw_module: if (ParseModuleAsm()) return true; break;
|
||||||
case lltok::kw_target: if (ParseTargetDefinition()) return true; break;
|
case lltok::kw_target: if (ParseTargetDefinition()) return true; break;
|
||||||
|
case lltok::kw_source_filename:
|
||||||
|
if (ParseSourceFileName())
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
case lltok::kw_deplibs: if (ParseDepLibs()) return true; break;
|
case lltok::kw_deplibs: if (ParseDepLibs()) return true; break;
|
||||||
case lltok::LocalVarID: if (ParseUnnamedType()) return true; break;
|
case lltok::LocalVarID: if (ParseUnnamedType()) return true; break;
|
||||||
case lltok::LocalVar: if (ParseNamedType()) return true; break;
|
case lltok::LocalVar: if (ParseNamedType()) return true; break;
|
||||||
@ -335,6 +339,19 @@ bool LLParser::ParseTargetDefinition() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// toplevelentity
|
||||||
|
/// ::= 'source_filename' '=' STRINGCONSTANT
|
||||||
|
bool LLParser::ParseSourceFileName() {
|
||||||
|
assert(Lex.getKind() == lltok::kw_source_filename);
|
||||||
|
std::string Str;
|
||||||
|
Lex.Lex();
|
||||||
|
if (ParseToken(lltok::equal, "expected '=' after source_filename") ||
|
||||||
|
ParseStringConstant(Str))
|
||||||
|
return true;
|
||||||
|
M->setSourceFileName(Str);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// toplevelentity
|
/// toplevelentity
|
||||||
/// ::= 'deplibs' '=' '[' ']'
|
/// ::= 'deplibs' '=' '[' ']'
|
||||||
/// ::= 'deplibs' '=' '[' STRINGCONSTANT (',' STRINGCONSTANT)* ']'
|
/// ::= 'deplibs' '=' '[' STRINGCONSTANT (',' STRINGCONSTANT)* ']'
|
||||||
|
@ -261,6 +261,7 @@ namespace llvm {
|
|||||||
bool ValidateEndOfModule();
|
bool ValidateEndOfModule();
|
||||||
bool ParseTargetDefinition();
|
bool ParseTargetDefinition();
|
||||||
bool ParseModuleAsm();
|
bool ParseModuleAsm();
|
||||||
|
bool ParseSourceFileName();
|
||||||
bool ParseDepLibs(); // FIXME: Remove in 4.0.
|
bool ParseDepLibs(); // FIXME: Remove in 4.0.
|
||||||
bool ParseUnnamedType();
|
bool ParseUnnamedType();
|
||||||
bool ParseNamedType();
|
bool ParseNamedType();
|
||||||
|
@ -59,6 +59,7 @@ namespace lltok {
|
|||||||
kw_notail,
|
kw_notail,
|
||||||
kw_target,
|
kw_target,
|
||||||
kw_triple,
|
kw_triple,
|
||||||
|
kw_source_filename,
|
||||||
kw_unwind,
|
kw_unwind,
|
||||||
kw_deplibs, // FIXME: Remove in 4.0
|
kw_deplibs, // FIXME: Remove in 4.0
|
||||||
kw_datalayout,
|
kw_datalayout,
|
||||||
|
@ -2203,6 +2203,22 @@ void AssemblyWriter::writeOperandBundles(ImmutableCallSite CS) {
|
|||||||
Out << " ]";
|
Out << " ]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Escape any backslashes in the source file (e.g. Windows paths)
|
||||||
|
/// before emitting, so that it is parsed properly by the lexer on input.
|
||||||
|
static void EscapeBackslashes(std::string Str,
|
||||||
|
SmallVectorImpl<char> &Res) {
|
||||||
|
for (auto C : Str) {
|
||||||
|
switch (C) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
Res.push_back('\\');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Res.push_back(C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AssemblyWriter::printModule(const Module *M) {
|
void AssemblyWriter::printModule(const Module *M) {
|
||||||
Machine.initialize();
|
Machine.initialize();
|
||||||
|
|
||||||
@ -2215,6 +2231,12 @@ void AssemblyWriter::printModule(const Module *M) {
|
|||||||
M->getModuleIdentifier().find('\n') == std::string::npos)
|
M->getModuleIdentifier().find('\n') == std::string::npos)
|
||||||
Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
|
Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
|
||||||
|
|
||||||
|
if (!M->getSourceFileName().empty()) {
|
||||||
|
SmallString<128> EscapedName;
|
||||||
|
EscapeBackslashes(M->getSourceFileName(), EscapedName);
|
||||||
|
Out << "source_filename = \"" << EscapedName << "\"\n";
|
||||||
|
}
|
||||||
|
|
||||||
const std::string &DL = M->getDataLayoutStr();
|
const std::string &DL = M->getDataLayoutStr();
|
||||||
if (!DL.empty())
|
if (!DL.empty())
|
||||||
Out << "target datalayout = \"" << DL << "\"\n";
|
Out << "target datalayout = \"" << DL << "\"\n";
|
||||||
|
8
test/Assembler/source-filename-backslash.ll
Normal file
8
test/Assembler/source-filename-backslash.ll
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
; Make sure that llvm-as/llvm-dis properly assemble/disassemble the
|
||||||
|
; source_filename.
|
||||||
|
|
||||||
|
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: source_filename = "C:\\path\\with\\backslashes\\test.cc"
|
||||||
|
source_filename = "C:\\path\\with\\backslashes\\test.cc"
|
8
test/Assembler/source-filename.ll
Normal file
8
test/Assembler/source-filename.ll
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
; Make sure that llvm-as/llvm-dis properly assemble/disassemble the
|
||||||
|
; source_filename.
|
||||||
|
|
||||||
|
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: source_filename = "test.cc"
|
||||||
|
source_filename = "test.cc"
|
Loading…
x
Reference in New Issue
Block a user