[llvm-commits] [llvm] r115909 - in /llvm/trunk: lib/MC/WinCOFFStreamer.cpp test/MC/COFF/symbol-alias.ll
Michael J. Spencer
bigcheesegs at gmail.com
Wed Oct 6 23:29:33 PDT 2010
Author: mspencer
Date: Thu Oct 7 01:29:33 2010
New Revision: 115909
URL: http://llvm.org/viewvc/llvm-project?rev=115909&view=rev
Log:
MC-COFF: Fix symbol aliases. Fixes PR8251.
Added:
llvm/trunk/test/MC/COFF/symbol-alias.ll
Modified:
llvm/trunk/lib/MC/WinCOFFStreamer.cpp
Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=115909&r1=115908&r2=115909&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Thu Oct 7 01:29:33 2010
@@ -157,11 +157,42 @@
}
void WinCOFFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
- // TODO: This is exactly the same as MachOStreamer. Consider merging into
- // MCObjectStreamer.
- getAssembler().getOrCreateSymbolData(*Symbol);
- AddValueSymbols(Value);
- Symbol->setVariableValue(Value);
+ // FIXME: This is all very ugly and depressing. What needs to happen here
+ // depends on quite a few things that are all part of relaxation, which we
+ // don't really even do.
+
+ if (Value->getKind() != MCExpr::SymbolRef) {
+ // TODO: This is exactly the same as MachOStreamer. Consider merging into
+ // MCObjectStreamer.
+ getAssembler().getOrCreateSymbolData(*Symbol);
+ AddValueSymbols(Value);
+ Symbol->setVariableValue(Value);
+ } else {
+ // FIXME: This is a horrible way to do this :(. This should really be
+ // handled after we are done with the MC* objects and immediately before
+ // writing out the object file when we know exactly what the symbol should
+ // look like in the coff symbol table. I'm not doing that now because the
+ // COFF object writer doesn't have a clearly defined separation between MC
+ // data structures, the object writers data structures, and the raw, POD,
+ // data structures that get written to disk.
+
+ // Copy over the aliased data.
+ MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
+ const MCSymbolData &RealSD = getAssembler().getOrCreateSymbolData(
+ dyn_cast<const MCSymbolRefExpr>(Value)->getSymbol());
+
+ // FIXME: This is particularly nasty because it breaks as soon as any data
+ // members of MCSymbolData change.
+ SD.CommonAlign = RealSD.CommonAlign;
+ SD.CommonSize = RealSD.CommonSize;
+ SD.Flags = RealSD.Flags;
+ SD.Fragment = RealSD.Fragment;
+ SD.Index = RealSD.Index;
+ SD.IsExternal = RealSD.IsExternal;
+ SD.IsPrivateExtern = RealSD.IsPrivateExtern;
+ SD.Offset = RealSD.Offset;
+ SD.SymbolSize = RealSD.SymbolSize;
+ }
}
void WinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
Added: llvm/trunk/test/MC/COFF/symbol-alias.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/symbol-alias.ll?rev=115909&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/symbol-alias.ll (added)
+++ llvm/trunk/test/MC/COFF/symbol-alias.ll Thu Oct 7 01:29:33 2010
@@ -0,0 +1,48 @@
+; The purpose of this test is to verify that symbol aliases
+; (@foo = alias <type> @bar) generate the correct entries in the symbol table.
+; They should be identical except for the name.
+
+; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s
+; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o - | coff-dump.py | FileCheck %s
+
+define void @foo() {
+entry:
+ ret void
+}
+
+ at bar = global i32 zeroinitializer
+
+ at foo_alias = alias void ()* @foo
+ at bar_alias = alias i32* @bar
+
+; CHECK: Name = {{_?}}foo
+; CHECK-NEXT: Value = [[FOO_VALUE:.*$]]
+; CHECK-NEXT: SectionNumber = [[FOO_SECTION_NUMBER:.*$]]
+; CHECK-NEXT: SimpleType = [[FOO_SIMPLE_TYPE:.*$]]
+; CHECK-NEXT: ComplexType = [[FOO_COMPLEX_TYPE:.*$]]
+; CHECK-NEXT: StorageClass = [[FOO_STORAGE_CLASS:.*$]]
+; CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS:.*$]]
+
+; CHECK: Name = {{_?}}bar
+; CHECK-NEXT: Value = [[BAR_VALUE:.*$]]
+; CHECK-NEXT: SectionNumber = [[BAR_SECTION_NUMBER:.*$]]
+; CHECK-NEXT: SimpleType = [[BAR_SIMPLE_TYPE:.*$]]
+; CHECK-NEXT: ComplexType = [[BAR_COMPLEX_TYPE:.*$]]
+; CHECK-NEXT: StorageClass = [[BAR_STORAGE_CLASS:.*$]]
+; CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS:.*$]]
+
+; CHECK: Name = {{_?}}foo_alias
+; CHECK-NEXT: Value = [[FOO_VALUE]]
+; CHECK-NEXT: SectionNumber = [[FOO_SECTION_NUMBER]]
+; CHECK-NEXT: SimpleType = [[FOO_SIMPLE_TYPE]]
+; CHECK-NEXT: ComplexType = [[FOO_COMPLEX_TYPE]]
+; CHECK-NEXT: StorageClass = [[FOO_STORAGE_CLASS]]
+; CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS]]
+
+; CHECK: Name = {{_?}}bar_alias
+; CHECK-NEXT: Value = [[BAR_VALUE]]
+; CHECK-NEXT: SectionNumber = [[BAR_SECTION_NUMBER]]
+; CHECK-NEXT: SimpleType = [[BAR_SIMPLE_TYPE]]
+; CHECK-NEXT: ComplexType = [[BAR_COMPLEX_TYPE]]
+; CHECK-NEXT: StorageClass = [[BAR_STORAGE_CLASS]]
+; CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS]]
More information about the llvm-commits
mailing list