This repository was archived by the owner on Mar 28, 2020. It is now read-only.
File tree Expand file tree Collapse file tree 7 files changed +58
-0
lines changed Expand file tree Collapse file tree 7 files changed +58
-0
lines changed Original file line number Diff line number Diff line change @@ -533,6 +533,7 @@ lltok::Kind LLLexer::LexIdentifier() {
533
533
KEYWORD (notail);
534
534
KEYWORD (target);
535
535
KEYWORD (triple);
536
+ KEYWORD (source_filename);
536
537
KEYWORD (unwind);
537
538
KEYWORD (deplibs); // FIXME: Remove in 4.0.
538
539
KEYWORD (datalayout);
Original file line number Diff line number Diff line change @@ -239,6 +239,10 @@ bool LLParser::ParseTopLevelEntities() {
239
239
case lltok::kw_define: if (ParseDefine ()) return true ; break ;
240
240
case lltok::kw_module: if (ParseModuleAsm ()) return true ; break ;
241
241
case lltok::kw_target: if (ParseTargetDefinition ()) return true ; break ;
242
+ case lltok::kw_source_filename:
243
+ if (ParseSourceFileName ())
244
+ return true ;
245
+ break ;
242
246
case lltok::kw_deplibs: if (ParseDepLibs ()) return true ; break ;
243
247
case lltok::LocalVarID: if (ParseUnnamedType ()) return true ; break ;
244
248
case lltok::LocalVar: if (ParseNamedType ()) return true ; break ;
@@ -335,6 +339,19 @@ bool LLParser::ParseTargetDefinition() {
335
339
}
336
340
}
337
341
342
+ // / toplevelentity
343
+ // / ::= 'source_filename' '=' STRINGCONSTANT
344
+ bool LLParser::ParseSourceFileName () {
345
+ assert (Lex.getKind () == lltok::kw_source_filename);
346
+ std::string Str;
347
+ Lex.Lex ();
348
+ if (ParseToken (lltok::equal, " expected '=' after source_filename" ) ||
349
+ ParseStringConstant (Str))
350
+ return true ;
351
+ M->setSourceFileName (Str);
352
+ return false ;
353
+ }
354
+
338
355
// / toplevelentity
339
356
// / ::= 'deplibs' '=' '[' ']'
340
357
// / ::= 'deplibs' '=' '[' STRINGCONSTANT (',' STRINGCONSTANT)* ']'
Original file line number Diff line number Diff line change @@ -261,6 +261,7 @@ namespace llvm {
261
261
bool ValidateEndOfModule ();
262
262
bool ParseTargetDefinition ();
263
263
bool ParseModuleAsm ();
264
+ bool ParseSourceFileName ();
264
265
bool ParseDepLibs (); // FIXME: Remove in 4.0.
265
266
bool ParseUnnamedType ();
266
267
bool ParseNamedType ();
Original file line number Diff line number Diff line change @@ -59,6 +59,7 @@ namespace lltok {
59
59
kw_notail,
60
60
kw_target,
61
61
kw_triple,
62
+ kw_source_filename,
62
63
kw_unwind,
63
64
kw_deplibs, // FIXME: Remove in 4.0
64
65
kw_datalayout,
Original file line number Diff line number Diff line change @@ -2203,6 +2203,22 @@ void AssemblyWriter::writeOperandBundles(ImmutableCallSite CS) {
2203
2203
Out << " ]" ;
2204
2204
}
2205
2205
2206
+ // / Escape any backslashes in the source file (e.g. Windows paths)
2207
+ // / before emitting, so that it is parsed properly by the lexer on input.
2208
+ static void EscapeBackslashes (std::string Str,
2209
+ SmallVectorImpl<char > &Res) {
2210
+ for (auto C : Str) {
2211
+ switch (C) {
2212
+ default :
2213
+ break ;
2214
+ case ' \\ ' :
2215
+ Res.push_back (' \\ ' );
2216
+ break ;
2217
+ }
2218
+ Res.push_back (C);
2219
+ }
2220
+ }
2221
+
2206
2222
void AssemblyWriter::printModule (const Module *M) {
2207
2223
Machine.initialize ();
2208
2224
@@ -2215,6 +2231,12 @@ void AssemblyWriter::printModule(const Module *M) {
2215
2231
M->getModuleIdentifier ().find (' \n ' ) == std::string::npos)
2216
2232
Out << " ; ModuleID = '" << M->getModuleIdentifier () << " '\n " ;
2217
2233
2234
+ if (!M->getSourceFileName ().empty ()) {
2235
+ SmallString<128 > EscapedName;
2236
+ EscapeBackslashes (M->getSourceFileName (), EscapedName);
2237
+ Out << " source_filename = \" " << EscapedName << " \"\n " ;
2238
+ }
2239
+
2218
2240
const std::string &DL = M->getDataLayoutStr ();
2219
2241
if (!DL.empty ())
2220
2242
Out << " target datalayout = \" " << DL << " \"\n " ;
Original file line number Diff line number Diff line change
1
+
2
+ ; Make sure that llvm-as/llvm-dis properly assemble/disassemble the
3
+ ; source_filename.
4
+
5
+ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
6
+
7
+ ; CHECK: source_filename = "C:\\path\\with\\backslashes\\test.cc"
8
+ source_filename = "C:\\p ath\\w ith\\b ackslashes\\t est.cc"
Original file line number Diff line number Diff line change
1
+
2
+ ; Make sure that llvm-as/llvm-dis properly assemble/disassemble the
3
+ ; source_filename.
4
+
5
+ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
6
+
7
+ ; CHECK: source_filename = "test.cc"
8
+ source_filename = "test.cc"
You can’t perform that action at this time.
0 commit comments