mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +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(target);
|
||||
KEYWORD(triple);
|
||||
KEYWORD(source_filename);
|
||||
KEYWORD(unwind);
|
||||
KEYWORD(deplibs); // FIXME: Remove in 4.0.
|
||||
KEYWORD(datalayout);
|
||||
|
@ -239,6 +239,10 @@ bool LLParser::ParseTopLevelEntities() {
|
||||
case lltok::kw_define: if (ParseDefine()) return true; break;
|
||||
case lltok::kw_module: if (ParseModuleAsm()) 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::LocalVarID: if (ParseUnnamedType()) 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
|
||||
/// ::= 'deplibs' '=' '[' ']'
|
||||
/// ::= 'deplibs' '=' '[' STRINGCONSTANT (',' STRINGCONSTANT)* ']'
|
||||
|
@ -261,6 +261,7 @@ namespace llvm {
|
||||
bool ValidateEndOfModule();
|
||||
bool ParseTargetDefinition();
|
||||
bool ParseModuleAsm();
|
||||
bool ParseSourceFileName();
|
||||
bool ParseDepLibs(); // FIXME: Remove in 4.0.
|
||||
bool ParseUnnamedType();
|
||||
bool ParseNamedType();
|
||||
|
@ -59,6 +59,7 @@ namespace lltok {
|
||||
kw_notail,
|
||||
kw_target,
|
||||
kw_triple,
|
||||
kw_source_filename,
|
||||
kw_unwind,
|
||||
kw_deplibs, // FIXME: Remove in 4.0
|
||||
kw_datalayout,
|
||||
|
@ -2203,6 +2203,22 @@ void AssemblyWriter::writeOperandBundles(ImmutableCallSite CS) {
|
||||
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) {
|
||||
Machine.initialize();
|
||||
|
||||
@ -2215,6 +2231,12 @@ void AssemblyWriter::printModule(const Module *M) {
|
||||
M->getModuleIdentifier().find('\n') == std::string::npos)
|
||||
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();
|
||||
if (!DL.empty())
|
||||
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