Produce errors when an assignment expression would use a common symbol.

An assignment will produce a symbol with a given section and offset. There is
no way to represent something like "1 byte after a common symbol".

This matches the behavior of GNU as.

Part of PR22217.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226470 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-01-19 17:30:24 +00:00
parent 0041050116
commit a7e4c407ad
3 changed files with 23 additions and 1 deletions

View File

@ -201,7 +201,17 @@ const MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {
if (!A)
return nullptr;
return &A->getSymbol();
const MCSymbol &ASym = A->getSymbol();
const MCAssembler &Asm = getAssembler();
const MCSymbolData &ASD = Asm.getSymbolData(ASym);
if (ASD.isCommon()) {
// FIXME: we should probably add a SMLoc to MCExpr.
Asm.getContext().FatalError(SMLoc(),
"Common symbol " + ASym.getName() +
" cannot be used in assignment expr");
}
return &ASym;
}
uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {

View File

@ -0,0 +1,6 @@
// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux < %s 2>&1 | FileCheck %s
.comm C,4,4
.set A,C
// CHECK: Common symbol C cannot be used in assignment expr

View File

@ -0,0 +1,6 @@
// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux < %s 2>&1 | FileCheck %s
.set A,C
.comm C,4,4
// CHECK: Common symbol C cannot be used in assignment expr