[COFF] Adjust how we flag weak externals

This fixes PR36096.

Originally based on a patch by Martell Malone.

Differential Revision: https://reviews.llvm.org/D44357

llvm-svn: 337613
This commit is contained in:
Martin Storsjo 2018-07-20 20:48:29 +00:00
parent d432d825ef
commit a6ffc9c8df
6 changed files with 71 additions and 11 deletions

View File

@ -276,6 +276,7 @@ struct coff_symbol_generic {
};
struct coff_aux_section_definition;
struct coff_aux_weak_external;
class COFFSymbolRef {
public:
@ -360,6 +361,13 @@ public:
return getAux<coff_aux_section_definition>();
}
const coff_aux_weak_external *getWeakExternal() const {
if (!getNumberOfAuxSymbols() ||
getStorageClass() != COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL)
return nullptr;
return getAux<coff_aux_weak_external>();
}
bool isAbsolute() const {
return getSectionNumber() == -1;
}

View File

@ -294,8 +294,7 @@ static bool isArchiveSymbol(const object::BasicSymbolRef &S) {
return false;
if (!(Symflags & object::SymbolRef::SF_Global))
return false;
if (Symflags & object::SymbolRef::SF_Undefined &&
!(Symflags & object::SymbolRef::SF_Indirect))
if (Symflags & object::SymbolRef::SF_Undefined)
return false;
return true;
}

View File

@ -217,10 +217,10 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {
if (Symb.isExternal() || Symb.isWeakExternal())
Result |= SymbolRef::SF_Global;
if (Symb.isWeakExternal()) {
if (const coff_aux_weak_external *AWE = Symb.getWeakExternal()) {
Result |= SymbolRef::SF_Weak;
// We use indirect to allow the archiver to write weak externs
Result |= SymbolRef::SF_Indirect;
if (AWE->Characteristics != COFF::IMAGE_WEAK_EXTERN_SEARCH_ALIAS)
Result |= SymbolRef::SF_Undefined;
}
if (Symb.getSectionNumber() == COFF::IMAGE_SYM_ABSOLUTE)
@ -235,7 +235,7 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {
if (Symb.isCommon())
Result |= SymbolRef::SF_Common;
if (Symb.isAnyUndefined())
if (Symb.isUndefined())
Result |= SymbolRef::SF_Undefined;
return Result;

View File

@ -0,0 +1,53 @@
# RUN: yaml2obj %s -o %t.obj
#
# RUN: rm -f %t.ar
# RUN: llvm-ar crs %t.a %t.obj
# RUN: llvm-nm -print-armap %t.a | FileCheck %s
# CHECK: Archive map
# CHECK-NEXT: WeakSearchAlias in coff-weak.yaml.tmp.obj
# CHECK-EMPTY:
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_UNKNOWN
Characteristics: [ ]
sections:
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
SectionData: ''
symbols:
- Name: NormalUndefined
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: WeakSearchAlias
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL
WeakExternal:
TagIndex: 0
Characteristics: IMAGE_WEAK_EXTERN_SEARCH_ALIAS
- Name: WeakSearchLibrary
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL
WeakExternal:
TagIndex: 0
Characteristics: IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
- Name: WeakSearchNolibrary
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL
WeakExternal:
TagIndex: 0
Characteristics: IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
...

View File

@ -22,5 +22,5 @@ StdcallAlias@4==StdcallFunction@4
; CHECK: Name type: name
; CHECK: Symbol: __imp_??_7exception@@6B@
; CHECK: Symbol: ??_7exception@@6B@
; CHECK-NM: w _StdcallAlias@4
; CHECK-NM: W _StdcallAlias@4
; CHECK-NM: U _StdcallFunction@4

View File

@ -15,14 +15,14 @@ ImpLibName2 = Implementation2 == AltTestFunction2
ImpLibName3 = kernel32.Sleep
; CHECK: U AltTestFunction
; CHECK-NEXT: w TestFunction
; CHECK-NEXT: W TestFunction
; CHECK: U __imp_AltTestFunction
; CHECK-NEXT: w __imp_TestFunction
; CHECK-NEXT: W __imp_TestFunction
; CHECK: T ImpLibName
; CHECK-NEXT: T __imp_ImpLibName
; CHECK: U AltTestFunction2
; CHECK-NEXT: w ImpLibName2
; CHECK-NEXT: W ImpLibName2
; CHECK: U __imp_AltTestFunction2
; CHECK-NEXT: w __imp_ImpLibName2
; CHECK-NEXT: W __imp_ImpLibName2
; CHECK: T ImpLibName3
; CHECK-NEXT: T __imp_ImpLibName3