[llvm] r341712 - [codeview] Add .cv_string directive for testing purposes
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 7 14:30:52 PDT 2018
Author: rnk
Date: Fri Sep 7 14:30:52 2018
New Revision: 341712
URL: http://llvm.org/viewvc/llvm-project?rev=341712&view=rev
Log:
[codeview] Add .cv_string directive for testing purposes
The main use case for this directive is to allow assembly writers to
write their own FPO data strings without going through the .cv_fpo*
directive family.
I'm experimenting with different RPN programs to fix PR38857, and I
figured I should go ahead and make this directive permanent.
Added:
llvm/trunk/test/MC/COFF/cv-string.s
Modified:
llvm/trunk/lib/MC/MCParser/AsmParser.cpp
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=341712&r1=341711&r2=341712&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Fri Sep 7 14:30:52 2018
@@ -467,6 +467,7 @@ private:
DK_CV_INLINE_LINETABLE,
DK_CV_DEF_RANGE,
DK_CV_STRINGTABLE,
+ DK_CV_STRING,
DK_CV_FILECHECKSUMS,
DK_CV_FILECHECKSUM_OFFSET,
DK_CV_FPO_DATA,
@@ -538,7 +539,7 @@ private:
bool parseDirectiveStabs();
// ".cv_file", ".cv_func_id", ".cv_inline_site_id", ".cv_loc", ".cv_linetable",
- // ".cv_inline_linetable", ".cv_def_range"
+ // ".cv_inline_linetable", ".cv_def_range", ".cv_string"
bool parseDirectiveCVFile();
bool parseDirectiveCVFuncId();
bool parseDirectiveCVInlineSiteId();
@@ -546,6 +547,7 @@ private:
bool parseDirectiveCVLinetable();
bool parseDirectiveCVInlineLinetable();
bool parseDirectiveCVDefRange();
+ bool parseDirectiveCVString();
bool parseDirectiveCVStringTable();
bool parseDirectiveCVFileChecksums();
bool parseDirectiveCVFileChecksumOffset();
@@ -2029,6 +2031,8 @@ bool AsmParser::parseStatement(ParseStat
return parseDirectiveCVInlineLinetable();
case DK_CV_DEF_RANGE:
return parseDirectiveCVDefRange();
+ case DK_CV_STRING:
+ return parseDirectiveCVString();
case DK_CV_STRINGTABLE:
return parseDirectiveCVStringTable();
case DK_CV_FILECHECKSUMS:
@@ -3813,6 +3817,20 @@ bool AsmParser::parseDirectiveCVDefRange
return false;
}
+/// parseDirectiveCVString
+/// ::= .cv_stringtable "string"
+bool AsmParser::parseDirectiveCVString() {
+ std::string Data;
+ if (checkForValidSection() || parseEscapedString(Data))
+ return addErrorSuffix(" in '.cv_string' directive");
+
+ // Put the string in the table and emit the offset.
+ std::pair<StringRef, unsigned> Insertion =
+ getCVContext().addToStringTable(Data);
+ getStreamer().EmitIntValue(Insertion.second, 4);
+ return false;
+}
+
/// parseDirectiveCVStringTable
/// ::= .cv_stringtable
bool AsmParser::parseDirectiveCVStringTable() {
@@ -5238,6 +5256,7 @@ void AsmParser::initializeDirectiveKindM
DirectiveKindMap[".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE;
DirectiveKindMap[".cv_inline_site_id"] = DK_CV_INLINE_SITE_ID;
DirectiveKindMap[".cv_def_range"] = DK_CV_DEF_RANGE;
+ DirectiveKindMap[".cv_string"] = DK_CV_STRING;
DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE;
DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS;
DirectiveKindMap[".cv_filechecksumoffset"] = DK_CV_FILECHECKSUM_OFFSET;
Added: llvm/trunk/test/MC/COFF/cv-string.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/cv-string.s?rev=341712&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/cv-string.s (added)
+++ llvm/trunk/test/MC/COFF/cv-string.s Fri Sep 7 14:30:52 2018
@@ -0,0 +1,69 @@
+# RUN: llvm-mc -triple=i686-windows-msvc %s -filetype=obj -o %t.obj
+# RUN: llvm-readobj -codeview %t.obj | FileCheck %s
+
+# The .cv_string directive mainly exists as a convenience for manually writing
+# FPO data in assembler. Test that we can write FPO data using this directive,
+# and that the string comes out in the dumper.
+
+# void g(int);
+# void f(int x) {
+# g(x+1);
+# }
+
+# CHECK: FrameFunc [
+# CHECK-NEXT: abc =
+# CHECK-NEXT: def =
+# CHECK-NEXT: ghi =
+# CHECK-NEXT: ]
+
+ .text
+ .def @feat.00;
+ .scl 3;
+ .type 0;
+ .endef
+ .globl @feat.00
+.set @feat.00, 1
+ .def _f;
+ .scl 2;
+ .type 32;
+ .endef
+ .globl _f # -- Begin function f
+ .p2align 4, 0x90
+_f: # @f
+Lfunc_begin0:
+# %bb.0: # %entry
+ pushl %ebp
+ movl %esp, %ebp
+ subl $8, %esp
+ movl 8(%ebp), %eax
+ movl 8(%ebp), %ecx
+ addl $1, %ecx
+ movl %ecx, (%esp)
+ movl %eax, -4(%ebp) # 4-byte Spill
+ calll _g
+ addl $8, %esp
+ popl %ebp
+ retl
+Lfunc_end0:
+ # -- End function
+ .section .debug$S,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+
+ # Open coded frame data
+ .long 245
+ .long Lfoo_fpo_end-Lfoo_fpo_begin # Subsection size
+Lfoo_fpo_begin:
+ .long _f
+ .long 0
+ .long Lfunc_end0-Lfunc_begin0
+ .long 24 # LocalSize
+ .long 0 # ParamSize
+ .long 0 # MaxStackSize
+ .cv_string "abc = def = ghi = "
+ .short 0 # PrologSize
+ .short 0 # SavedRegSize
+ .long 0x4 # Flags
+Lfoo_fpo_end:
+ .p2align 2
+ .cv_stringtable # String table
More information about the llvm-commits
mailing list