llvm.org GIT mirror llvm / 5c05563
Change CodeGen to use .loc directives. This produces a lot more readable output and testing is easier. A good example is the unknown-location.ll test that now can just look for ".loc 1 0 0". We also don't use a DW_LNE_set_address for every address change anymore. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119613 91177308-0d34-0410-b5e6-96231b3b80d8 Rafael Espindola 10 years ago
7 changed file(s) with 35 addition(s) and 347 deletion(s). Raw diff Collapse all Expand all
236236 /// HasLEB128 - True if target asm supports leb128 directives.
237237 bool HasLEB128; // Defaults to false.
238238
239 /// hasDotLocAndDotFile - True if target asm supports .loc and .file
240 /// directives for emitting debugging information.
241 bool HasDotLocAndDotFile; // Defaults to false.
242
243239 /// SupportsDebugInformation - True if target supports emission of debugging
244240 /// information.
245241 bool SupportsDebugInformation; // Defaults to false.
409405 bool hasLEB128() const {
410406 return HasLEB128;
411407 }
412 bool hasDotLocAndDotFile() const {
413 return HasDotLocAndDotFile;
414 }
415408 bool doesSupportDebugInformation() const {
416409 return SupportsDebugInformation;
417410 }
513513 unsigned Line = V.getLineNumber();
514514 if (Line == 0)
515515 return;
516 unsigned FileID = GetOrCreateSourceID(V.getContext().getDirectory(),
517 V.getContext().getFilename());
516 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename());
518517 assert(FileID && "Invalid file id");
519518 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
520519 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
530529 unsigned Line = G.getLineNumber();
531530 if (Line == 0)
532531 return;
533 unsigned FileID = GetOrCreateSourceID(G.getContext().getDirectory(),
534 G.getContext().getFilename());
532 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename());
535533 assert(FileID && "Invalid file id");
536534 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
537535 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
550548 unsigned Line = SP.getLineNumber();
551549 if (!SP.getContext().Verify())
552550 return;
553 unsigned FileID = GetOrCreateSourceID(SP.getDirectory(),
554 SP.getFilename());
551 unsigned FileID = GetOrCreateSourceID(SP.getFilename());
555552 assert(FileID && "Invalid file id");
556553 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
557554 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
567564 unsigned Line = Ty.getLineNumber();
568565 if (Line == 0 || !Ty.getContext().Verify())
569566 return;
570 unsigned FileID = GetOrCreateSourceID(Ty.getDirectory(),
571 Ty.getFilename());
567 unsigned FileID = GetOrCreateSourceID(Ty.getFilename());
572568 assert(FileID && "Invalid file id");
573569 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
574570 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
585581 if (Line == 0)
586582 return;
587583 StringRef FN = NS.getFilename();
588 StringRef Dir = NS.getDirectory();
589
590 unsigned FileID = GetOrCreateSourceID(Dir, FN);
584
585 unsigned FileID = GetOrCreateSourceID(FN);
591586 assert(FileID && "Invalid file id");
592587 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
593588 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
17711766 /// source file names. If none currently exists, create a new id and insert it
17721767 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
17731768 /// maps as well.
1774 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1775 unsigned DId;
1776 assert (DirName.empty() == false && "Invalid directory name!");
1777
1769
1770 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName){
17781771 // If FE did not provide a file name, then assume stdin.
17791772 if (FileName.empty())
1780 return GetOrCreateSourceID(DirName, "");
1781
1782 StringMap::iterator DI = DirectoryIdMap.find(DirName);
1783 if (DI != DirectoryIdMap.end()) {
1784 DId = DI->getValue();
1785 } else {
1786 DId = DirectoryNames.size() + 1;
1787 DirectoryIdMap[DirName] = DId;
1788 DirectoryNames.push_back(DirName);
1789 }
1790
1791 unsigned FId;
1792 StringMap::iterator FI = SourceFileIdMap.find(FileName);
1793 if (FI != SourceFileIdMap.end()) {
1794 FId = FI->getValue();
1795 } else {
1796 FId = SourceFileNames.size() + 1;
1797 SourceFileIdMap[FileName] = FId;
1798 SourceFileNames.push_back(FileName);
1799 }
1800
1801 DenseMap, unsigned>::iterator SI =
1802 SourceIdMap.find(std::make_pair(DId, FId));
1803 if (SI != SourceIdMap.end())
1804 return SI->second;
1805
1806 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1807 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1808 SourceIds.push_back(std::make_pair(DId, FId));
1773 return GetOrCreateSourceID("");
1774
1775 StringMapEntry &Entry = SourceIdMap.GetOrCreateValue(FileName);
1776 if (Entry.getValue())
1777 return Entry.getValue();
1778
1779 unsigned SrcId = SourceIdMap.size();
1780 Entry.setValue(SrcId);
1781
1782 // Print out a .file directive to specify files for .loc directives.
1783 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, FileName);
18091784
18101785 return SrcId;
18111786 }
18311806 DICompileUnit DIUnit(N);
18321807 StringRef FN = DIUnit.getFilename();
18331808 StringRef Dir = DIUnit.getDirectory();
1834 unsigned ID = GetOrCreateSourceID(Dir, FN);
1809 unsigned ID = GetOrCreateSourceID(FN);
18351810
18361811 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
18371812 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
20782053
20792054 // Prime section data.
20802055 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2081
2082 // Print out .file directives to specify files for .loc directives. These are
2083 // printed out early so that they precede any .loc directives.
2084 if (Asm->MAI->hasDotLocAndDotFile()) {
2085 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
2086 // Remember source id starts at 1.
2087 std::pair Id = getSourceDirectoryAndFileIds(i);
2088 // FIXME: don't use sys::path for this! This should not depend on the
2089 // host.
2090 sys::Path FullPath(getSourceDirectoryName(Id.first));
2091 bool AppendOk =
2092 FullPath.appendComponent(getSourceFileName(Id.second));
2093 assert(AppendOk && "Could not append filename to directory!");
2094 AppendOk = false;
2095 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2096 }
2097 }
20982056 }
20992057
21002058 /// endModule - Emit all Dwarf sections that should come after the content.
21832141
21842142 // Corresponding abbreviations into a abbrev section.
21852143 emitAbbreviations();
2186
2187 // Emit source line correspondence into a debug line section.
2188 emitDebugLines();
21892144
21902145 // Emit info into a debug pubnames section.
21912146 emitDebugPubNames();
28722827 SmallPtrSet ProcessedVars;
28732828 collectVariableInfo(MF, ProcessedVars);
28742829
2875 // Get function line info.
2876 if (!Lines.empty()) {
2877 // Get section line info.
2878 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2879 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2880 std::vector &SectionLineInfos = SectionSourceLines[ID-1];
2881 // Append the function info to section info.
2882 SectionLineInfos.insert(SectionLineInfos.end(),
2883 Lines.begin(), Lines.end());
2884 }
2885
28862830 // Construct abstract scopes.
28872831 for (SmallVector::iterator AI = AbstractScopesList.begin(),
28882832 AE = AbstractScopesList.end(); AI != AE; ++AI) {
29332877 AbstractVariables.clear();
29342878 LabelsBeforeInsn.clear();
29352879 LabelsAfterInsn.clear();
2936 Lines.clear();
29372880 PrevLabel = NULL;
29382881 }
29392882
29802923 /// the source line list.
29812924 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
29822925 const MDNode *S) {
2983 StringRef Dir;
29842926 StringRef Fn;
29852927
29862928 unsigned Src = 1;
29892931
29902932 if (Scope.isCompileUnit()) {
29912933 DICompileUnit CU(S);
2992 Dir = CU.getDirectory();
29932934 Fn = CU.getFilename();
29942935 } else if (Scope.isFile()) {
29952936 DIFile F(S);
2996 Dir = F.getDirectory();
29972937 Fn = F.getFilename();
29982938 } else if (Scope.isSubprogram()) {
29992939 DISubprogram SP(S);
3000 Dir = SP.getDirectory();
30012940 Fn = SP.getFilename();
30022941 } else if (Scope.isLexicalBlock()) {
30032942 DILexicalBlock DB(S);
3004 Dir = DB.getDirectory();
30052943 Fn = DB.getFilename();
30062944 } else
30072945 assert(0 && "Unexpected scope info");
30082946
3009 Src = GetOrCreateSourceID(Dir, Fn);
3010 }
2947 Src = GetOrCreateSourceID(Fn);
2948 }
2949
2950 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
2951 0, 0);
30112952
30122953 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
3013 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
3014
30152954 Asm->OutStreamer.EmitLabel(Label);
30162955 return Label;
30172956 }
33203259 Asm->EmitInt8(0);
33213260 Asm->EmitInt8(1);
33223261 Asm->EmitInt8(1);
3323 }
3324
3325 /// emitDebugLines - Emit source line information.
3326 ///
3327 void DwarfDebug::emitDebugLines() {
3328 // If the target is using .loc/.file, the assembler will be emitting the
3329 // .debug_line table automatically.
3330 if (Asm->MAI->hasDotLocAndDotFile())
3331 return;
3332
3333 // Minimum line delta, thus ranging from -10..(255-10).
3334 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3335 // Maximum line delta, thus ranging from -10..(255-10).
3336 const int MaxLineDelta = 255 + MinLineDelta;
3337
3338 // Start the dwarf line section.
3339 Asm->OutStreamer.SwitchSection(
3340 Asm->getObjFileLowering().getDwarfLineSection());
3341
3342 // Construct the section header.
3343 Asm->OutStreamer.AddComment("Length of Source Line Info");
3344 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3345 Asm->GetTempSymbol("line_begin"), 4);
3346 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3347
3348 Asm->OutStreamer.AddComment("DWARF version number");
3349 Asm->EmitInt16(dwarf::DWARF_VERSION);
3350
3351 Asm->OutStreamer.AddComment("Prolog Length");
3352 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3353 Asm->GetTempSymbol("line_prolog_begin"), 4);
3354 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3355
3356 Asm->OutStreamer.AddComment("Minimum Instruction Length");
3357 Asm->EmitInt8(1);
3358 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3359 Asm->EmitInt8(1);
3360 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3361 Asm->EmitInt8(MinLineDelta);
3362 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3363 Asm->EmitInt8(MaxLineDelta);
3364 Asm->OutStreamer.AddComment("Special Opcode Base");
3365 Asm->EmitInt8(-MinLineDelta);
3366
3367 // Line number standard opcode encodings argument count
3368 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3369 Asm->EmitInt8(0);
3370 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3371 Asm->EmitInt8(1);
3372 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3373 Asm->EmitInt8(1);
3374 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3375 Asm->EmitInt8(1);
3376 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3377 Asm->EmitInt8(1);
3378 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3379 Asm->EmitInt8(0);
3380 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3381 Asm->EmitInt8(0);
3382 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3383 Asm->EmitInt8(0);
3384 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3385 Asm->EmitInt8(1);
3386
3387 // Emit directories.
3388 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3389 const std::string &Dir = getSourceDirectoryName(DI);
3390 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3391 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3392 }
3393
3394 Asm->OutStreamer.AddComment("End of directories");
3395 Asm->EmitInt8(0);
3396
3397 // Emit files.
3398 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3399 // Remember source id starts at 1.
3400 std::pair Id = getSourceDirectoryAndFileIds(SI);
3401 const std::string &FN = getSourceFileName(Id.second);
3402 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3403 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3404
3405 Asm->EmitULEB128(Id.first, "Directory #");
3406 Asm->EmitULEB128(0, "Mod date");
3407 Asm->EmitULEB128(0, "File size");
3408 }
3409
3410 Asm->OutStreamer.AddComment("End of files");
3411 Asm->EmitInt8(0);
3412
3413 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3414
3415 // A sequence for each text section.
3416 unsigned SecSrcLinesSize = SectionSourceLines.size();
3417
3418 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3419 // Isolate current sections line info.
3420 const std::vector &LineInfos = SectionSourceLines[j];
3421
3422 // Dwarf assumes we start with first line of first source file.
3423 unsigned Source = 1;
3424 unsigned Line = 1;
3425
3426 // Construct rows of the address, source, line, column matrix.
3427 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3428 const SrcLineInfo &LineInfo = LineInfos[i];
3429 MCSymbol *Label = LineInfo.getLabel();
3430 if (!Label->isDefined()) continue; // Not emitted, in dead code.
3431
3432 if (Asm->isVerbose()) {
3433 std::pair SrcID =
3434 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3435 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3436 "/" +
3437 Twine(getSourceFileName(SrcID.second)) +
3438 ":" + Twine(LineInfo.getLine()));
3439 }
3440
3441 // Define the line address.
3442 Asm->OutStreamer.AddComment("Extended Op");
3443 Asm->EmitInt8(0);
3444 Asm->OutStreamer.AddComment("Op size");
3445 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3446
3447 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3448 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3449
3450 Asm->OutStreamer.AddComment("Location label");
3451 Asm->OutStreamer.EmitSymbolValue(Label,
3452 Asm->getTargetData().getPointerSize(),
3453 0/*AddrSpace*/);
3454
3455 // If change of source, then switch to the new source.
3456 if (Source != LineInfo.getSourceID()) {
3457 Source = LineInfo.getSourceID();
3458 Asm->OutStreamer.AddComment("DW_LNS_set_file");
3459 Asm->EmitInt8(dwarf::DW_LNS_set_file);
3460 Asm->EmitULEB128(Source, "New Source");
3461 }
3462
3463 // If change of line.
3464 if (Line != LineInfo.getLine()) {
3465 // Determine offset.
3466 int Offset = LineInfo.getLine() - Line;
3467 int Delta = Offset - MinLineDelta;
3468
3469 // Update line.
3470 Line = LineInfo.getLine();
3471
3472 // If delta is small enough and in range...
3473 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3474 // ... then use fast opcode.
3475 Asm->OutStreamer.AddComment("Line Delta");
3476 Asm->EmitInt8(Delta - MinLineDelta);
3477 } else {
3478 // ... otherwise use long hand.
3479 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3480 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3481 Asm->EmitSLEB128(Offset, "Line Offset");
3482 Asm->OutStreamer.AddComment("DW_LNS_copy");
3483 Asm->EmitInt8(dwarf::DW_LNS_copy);
3484 }
3485 } else {
3486 // Copy the previous row (different address or source)
3487 Asm->OutStreamer.AddComment("DW_LNS_copy");
3488 Asm->EmitInt8(dwarf::DW_LNS_copy);
3489 }
3490 }
3491
3492 emitEndOfLineMatrix(j + 1);
3493 }
3494
3495 if (SecSrcLinesSize == 0)
3496 // Because we're emitting a debug_line section, we still need a line
3497 // table. The linker and friends expect it to exist. If there's nothing to
3498 // put into it, emit an empty table.
3499 emitEndOfLineMatrix(1);
3500
3501 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
35023262 }
35033263
35043264 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
9393 ///
9494 std::vector Abbreviations;
9595
96 /// DirectoryIdMap - Directory name to directory id map.
97 ///
98 StringMap DirectoryIdMap;
99
100 /// DirectoryNames - A list of directory names.
101 SmallVector DirectoryNames;
102
103 /// SourceFileIdMap - Source file name to source file id map.
104 ///
105 StringMap SourceFileIdMap;
106
107 /// SourceFileNames - A list of source file names.
108 SmallVector SourceFileNames;
109
11096 /// SourceIdMap - Source id map, i.e. pair of directory id and source file
11197 /// id mapped to a unique id.
112 DenseMap, unsigned> SourceIdMap;
113
114 /// SourceIds - Reverse map from source id to directory id + file id pair.
115 ///
116 SmallVector, 8> SourceIds;
117
118 /// Lines - List of source line correspondence.
119 std::vector Lines;
98 StringMap SourceIdMap;
12099
121100 /// DIEBlocks - A list of all the DIEBlocks in use.
122101 std::vector DIEBlocks;
134113 /// SectionMap - Provides a unique id per text section.
135114 ///
136115 UniqueVector SectionMap;
137
138 /// SectionSourceLines - Tracks line numbers per text section.
139 ///
140 std::vector > SectionSourceLines;
141116
142117 // CurrentFnDbgScope - Top level scope for the current function.
143118 //
262237
263238 DIEInteger *DIEIntegerOne;
264239 private:
265
266 /// getSourceDirectoryAndFileIds - Return the directory and file ids that
267 /// maps to the source id. Source id starts at 1.
268 std::pair
269 getSourceDirectoryAndFileIds(unsigned SId) const {
270 return SourceIds[SId-1];
271 }
272
273 /// getNumSourceDirectories - Return the number of source directories in the
274 /// debug info.
275 unsigned getNumSourceDirectories() const {
276 return DirectoryNames.size();
277 }
278
279 /// getSourceDirectoryName - Return the name of the directory corresponding
280 /// to the id.
281 const std::string &getSourceDirectoryName(unsigned Id) const {
282 return DirectoryNames[Id - 1];
283 }
284
285 /// getSourceFileName - Return the name of the source file corresponding
286 /// to the id.
287 const std::string &getSourceFileName(unsigned Id) const {
288 return SourceFileNames[Id - 1];
289 }
290240
291241 /// getNumSourceIds - Return the number of unique source ids.
292242 unsigned getNumSourceIds() const {
293 return SourceIds.size();
243 return SourceIdMap.size();
294244 }
295245
296246 /// assignAbbrevNumber - Define a unique number for the abbreviation.
477427 /// the line matrix.
478428 ///
479429 void emitEndOfLineMatrix(unsigned SectionEnd);
480
481 /// emitDebugLines - Emit source line information.
482 ///
483 void emitDebugLines();
484430
485431 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
486432 ///
540486
541487 /// GetOrCreateSourceID - Look up the source id with the given directory and
542488 /// source file names. If none currently exists, create a new id and insert it
543 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
544 /// maps as well.
545 unsigned GetOrCreateSourceID(StringRef DirName, StringRef FileName);
489 /// in the SourceIds map.
490 unsigned GetOrCreateSourceID(StringRef FullName);
546491
547492 /// constructCompileUnit - Create new CompileUnit for the given
548493 /// metadata node with tag DW_TAG_compile_unit.
561506 /// unique label that was emitted and which provides correspondence to
562507 /// the source line list.
563508 MCSymbol *recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope);
564
565 /// getSourceLineCount - Return the number of source lines in the debug
566 /// info.
567 unsigned getSourceLineCount() const {
568 return Lines.size();
569 }
570509
571510 /// recordVariableFrameIndex - Record a variable's index.
572511 void recordVariableFrameIndex(const DbgVariable *V, int Index);
6363 HiddenVisibilityAttr = MCSA_Hidden;
6464 ProtectedVisibilityAttr = MCSA_Protected;
6565 HasLEB128 = false;
66 HasDotLocAndDotFile = false;
6766 SupportsDebugInformation = false;
6867 ExceptionsType = ExceptionHandling::None;
6968 DwarfRequiresFrameSection = true;
2323 GlobalPrefix = "";
2424 PrivateGlobalPrefix = ".L";
2525
26 // Has leb128, .loc and .file
26 // Has leb128
2727 HasLEB128 = true;
28 HasDotLocAndDotFile = true;
2928
3029 SupportsDebugInformation = true;
3130
0 ; RUN: llc < %s -asm-verbose=false -march=x86-64 -use-unknown-locations | FileCheck %s
11
22 ; The divide instruction does not have a debug location. CodeGen should
3 ; represent this in the debug information. This is checked by a check
4 ; for a label between the code for the add and the code for the divide,
5 ; which indicates that the add's location doesn't spill over unto the
6 ; divide.
3 ; represent this in the debug information. This is done by setting line
4 ; and column to 0
75
86 ; CHECK: leal (%rdi,%rsi), %eax
7 ; CHECK-NEXT: .loc 1 0 0
98 ; CHECK-NEXT: Ltmp
109 ; CHECK-NEXT: cltd
1110 ; CHECK-NEXT: idivl %r8d
11 ; CHECK-NEXT: .loc 1 4 3
1212 ; CHECK-NEXT: Ltmp
1313 ; CHECK-NEXT: addl %ecx, %eax
1414 ; CHECK-NEXT: ret
0 ; RUN: llc -O0 < %s - | FileCheck %s
11 ; Radar 8286101
2 ; CHECK: File size
3 ; CHECK-NEXT: stdin
4 ; CHECK-NEXT: Directory
2 ; CHECK: .file 2 ""
53
64 define i32 @foo() nounwind ssp {
75 entry: