summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Haarman <llvm@inglorion.net>2019-01-24 21:41:03 +0000
committerBob Haarman <llvm@inglorion.net>2019-01-24 21:41:03 +0000
commit38ebaf7d5d25ef3113a6ab4bf19ed4e1869373ab (patch)
tree6a932c8d90261a5e6c4bbabe25bc1495fd80ea12
parentcb52cd4d7f41eab2f3edf17234f4dd73b760d019 (diff)
downloadbcm5719-llvm-38ebaf7d5d25ef3113a6ab4bf19ed4e1869373ab.tar.gz
bcm5719-llvm-38ebaf7d5d25ef3113a6ab4bf19ed4e1869373ab.zip
allow COFF .def directive in module assembly when using ThinLTO
Summary: Using COFF's .def directive in module assembly used to crash ThinLTO with "this directive only supported on COFF targets" when getting symbol information in ModuleSymbolTable. This change allows ModuleSymbolTable to process such code and adds a test to verify that the .def directive has the desired effect on the native object file, with and without ThinLTO. Fixes https://bugs.llvm.org/show_bug.cgi?id=36789 Reviewers: rnk, pcc, vlad.tsyrklevich Subscribers: mehdi_amini, eraman, hiraditya, dexonsmith, llvm-commits Differential Revision: https://reviews.llvm.org/D57073 llvm-svn: 352112
-rw-r--r--llvm/lib/Object/RecordStreamer.h9
-rw-r--r--llvm/test/MC/COFF/module-asm-coff.ll21
2 files changed, 30 insertions, 0 deletions
diff --git a/llvm/lib/Object/RecordStreamer.h b/llvm/lib/Object/RecordStreamer.h
index ac501725ecd..5ac9cd6a4f5 100644
--- a/llvm/lib/Object/RecordStreamer.h
+++ b/llvm/lib/Object/RecordStreamer.h
@@ -55,6 +55,15 @@ public:
unsigned ByteAlignment, SMLoc Loc = SMLoc()) override;
void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override;
+
+ // Ignore COFF-specific directives; we do not need any information from them,
+ // but the default implementation of these methods crashes, so we override
+ // them with versions that do nothing.
+ void BeginCOFFSymbolDef(const MCSymbol *Symbol) override {}
+ void EmitCOFFSymbolStorageClass(int StorageClass) override {}
+ void EmitCOFFSymbolType(int Type) override {}
+ void EndCOFFSymbolDef() override {}
+
/// Record .symver aliases for later processing.
void emitELFSymverDirective(StringRef AliasName,
const MCSymbol *Aliasee) override;
diff --git a/llvm/test/MC/COFF/module-asm-coff.ll b/llvm/test/MC/COFF/module-asm-coff.ll
new file mode 100644
index 00000000000..38e108031d3
--- /dev/null
+++ b/llvm/test/MC/COFF/module-asm-coff.ll
@@ -0,0 +1,21 @@
+; Tests COFF-specific directives in module level assembly.
+
+; RUN: llc -filetype=obj %s -o %t.obj
+; RUN: llvm-readobj -t %t.obj | FileCheck %s
+; RUN: opt -thinlto-bc %s -o %t.thinlto.bc
+; RUN: llvm-lto2 run %t.thinlto.bc -o %t.thinlto.obj -r=%t.thinlto.bc,foo,plx
+; RUN: llvm-readobj -t %t.thinlto.obj.1 | FileCheck %s
+
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.0.24210"
+
+module asm ".text"
+module asm ".def foo; .scl 3; .type 32; .endef"
+module asm ".global foo"
+module asm "foo:"
+module asm " ret"
+
+; CHECK: Symbol {
+; CHECK: Name: foo
+; CHECK: StorageClass:
+; CHECK-SAME: Static (0x3)
OpenPOWER on IntegriCloud