Index: llvm/trunk/include/llvm/Object/COFF.h =================================================================== --- llvm/trunk/include/llvm/Object/COFF.h +++ llvm/trunk/include/llvm/Object/COFF.h @@ -276,6 +276,7 @@ }; struct coff_aux_section_definition; +struct coff_aux_weak_external; class COFFSymbolRef { public: @@ -360,6 +361,13 @@ return getAux(); } + const coff_aux_weak_external *getWeakExternal() const { + if (!getNumberOfAuxSymbols() || + getStorageClass() != COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL) + return nullptr; + return getAux(); + } + bool isAbsolute() const { return getSectionNumber() == -1; } Index: llvm/trunk/lib/Object/ArchiveWriter.cpp =================================================================== --- llvm/trunk/lib/Object/ArchiveWriter.cpp +++ llvm/trunk/lib/Object/ArchiveWriter.cpp @@ -294,8 +294,7 @@ 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; } Index: llvm/trunk/lib/Object/COFFObjectFile.cpp =================================================================== --- llvm/trunk/lib/Object/COFFObjectFile.cpp +++ llvm/trunk/lib/Object/COFFObjectFile.cpp @@ -217,10 +217,10 @@ 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 @@ if (Symb.isCommon()) Result |= SymbolRef::SF_Common; - if (Symb.isAnyUndefined()) + if (Symb.isUndefined()) Result |= SymbolRef::SF_Undefined; return Result; Index: llvm/trunk/test/tools/llvm-ar/coff-weak.yaml =================================================================== --- llvm/trunk/test/tools/llvm-ar/coff-weak.yaml +++ llvm/trunk/test/tools/llvm-ar/coff-weak.yaml @@ -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 +... Index: llvm/trunk/test/tools/llvm-dlltool/coff-decorated.def =================================================================== --- llvm/trunk/test/tools/llvm-dlltool/coff-decorated.def +++ llvm/trunk/test/tools/llvm-dlltool/coff-decorated.def @@ -22,5 +22,5 @@ ; 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 Index: llvm/trunk/test/tools/llvm-dlltool/coff-weak-exports.def =================================================================== --- llvm/trunk/test/tools/llvm-dlltool/coff-weak-exports.def +++ llvm/trunk/test/tools/llvm-dlltool/coff-weak-exports.def @@ -15,14 +15,14 @@ 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