1
0
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:
Teresa Johnson 2016-03-30 18:15:08 +00:00
parent adf292b0b4
commit caec55026e
7 changed files with 58 additions and 0 deletions

View File

@ -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);

View File

@ -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)* ']'

View File

@ -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();

View File

@ -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,

View File

@ -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";

View 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"

View 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"