File tree 6 files changed +71
-11
lines changed
6 files changed +71
-11
lines changed Original file line number Diff line number Diff line change @@ -276,6 +276,7 @@ struct coff_symbol_generic {
276
276
};
277
277
278
278
struct coff_aux_section_definition ;
279
+ struct coff_aux_weak_external ;
279
280
280
281
class COFFSymbolRef {
281
282
public:
@@ -360,6 +361,13 @@ class COFFSymbolRef {
360
361
return getAux<coff_aux_section_definition>();
361
362
}
362
363
364
+ const coff_aux_weak_external *getWeakExternal () const {
365
+ if (!getNumberOfAuxSymbols () ||
366
+ getStorageClass () != COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL)
367
+ return nullptr ;
368
+ return getAux<coff_aux_weak_external>();
369
+ }
370
+
363
371
bool isAbsolute () const {
364
372
return getSectionNumber () == -1 ;
365
373
}
Original file line number Diff line number Diff line change @@ -294,8 +294,7 @@ static bool isArchiveSymbol(const object::BasicSymbolRef &S) {
294
294
return false ;
295
295
if (!(Symflags & object::SymbolRef::SF_Global))
296
296
return false ;
297
- if (Symflags & object::SymbolRef::SF_Undefined &&
298
- !(Symflags & object::SymbolRef::SF_Indirect))
297
+ if (Symflags & object::SymbolRef::SF_Undefined)
299
298
return false ;
300
299
return true ;
301
300
}
Original file line number Diff line number Diff line change @@ -217,10 +217,10 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {
217
217
if (Symb.isExternal () || Symb.isWeakExternal ())
218
218
Result |= SymbolRef::SF_Global;
219
219
220
- if (Symb.isWeakExternal ()) {
220
+ if (const coff_aux_weak_external *AWE = Symb.getWeakExternal ()) {
221
221
Result |= SymbolRef::SF_Weak;
222
- // We use indirect to allow the archiver to write weak externs
223
- Result |= SymbolRef::SF_Indirect ;
222
+ if (AWE-> Characteristics != COFF::IMAGE_WEAK_EXTERN_SEARCH_ALIAS)
223
+ Result |= SymbolRef::SF_Undefined ;
224
224
}
225
225
226
226
if (Symb.getSectionNumber () == COFF::IMAGE_SYM_ABSOLUTE)
@@ -235,7 +235,7 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {
235
235
if (Symb.isCommon ())
236
236
Result |= SymbolRef::SF_Common;
237
237
238
- if (Symb.isAnyUndefined ())
238
+ if (Symb.isUndefined ())
239
239
Result |= SymbolRef::SF_Undefined;
240
240
241
241
return Result;
Original file line number Diff line number Diff line change
1
+ # RUN: yaml2obj %s -o %t.obj
2
+ #
3
+ # RUN: rm -f %t.ar
4
+ # RUN: llvm-ar crs %t.a %t.obj
5
+ # RUN: llvm-nm -print-armap %t.a | FileCheck %s
6
+
7
+ # CHECK: Archive map
8
+ # CHECK-NEXT: WeakSearchAlias in coff-weak.yaml.tmp.obj
9
+ # CHECK-EMPTY:
10
+
11
+ --- !COFF
12
+ header :
13
+ Machine : IMAGE_FILE_MACHINE_UNKNOWN
14
+ Characteristics : [ ]
15
+ sections :
16
+ - Name : .drectve
17
+ Characteristics : [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
18
+ SectionData : ' '
19
+ symbols :
20
+ - Name : NormalUndefined
21
+ Value : 0
22
+ SectionNumber : 0
23
+ SimpleType : IMAGE_SYM_TYPE_NULL
24
+ ComplexType : IMAGE_SYM_DTYPE_NULL
25
+ StorageClass : IMAGE_SYM_CLASS_EXTERNAL
26
+ - Name : WeakSearchAlias
27
+ Value : 0
28
+ SectionNumber : 0
29
+ SimpleType : IMAGE_SYM_TYPE_NULL
30
+ ComplexType : IMAGE_SYM_DTYPE_NULL
31
+ StorageClass : IMAGE_SYM_CLASS_WEAK_EXTERNAL
32
+ WeakExternal :
33
+ TagIndex : 0
34
+ Characteristics : IMAGE_WEAK_EXTERN_SEARCH_ALIAS
35
+ - Name : WeakSearchLibrary
36
+ Value : 0
37
+ SectionNumber : 0
38
+ SimpleType : IMAGE_SYM_TYPE_NULL
39
+ ComplexType : IMAGE_SYM_DTYPE_NULL
40
+ StorageClass : IMAGE_SYM_CLASS_WEAK_EXTERNAL
41
+ WeakExternal :
42
+ TagIndex : 0
43
+ Characteristics : IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
44
+ - Name : WeakSearchNolibrary
45
+ Value : 0
46
+ SectionNumber : 0
47
+ SimpleType : IMAGE_SYM_TYPE_NULL
48
+ ComplexType : IMAGE_SYM_DTYPE_NULL
49
+ StorageClass : IMAGE_SYM_CLASS_WEAK_EXTERNAL
50
+ WeakExternal :
51
+ TagIndex : 0
52
+ Characteristics : IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
53
+ ...
Original file line number Diff line number Diff line change @@ -22,5 +22,5 @@ StdcallAlias@4==StdcallFunction@4
22
22
; CHECK: Name type: name
23
23
; CHECK: Symbol: __imp_??_7exception@@6B@
24
24
; CHECK: Symbol: ??_7exception@@6B@
25
- ; CHECK-NM: w _StdcallAlias@4
25
+ ; CHECK-NM: W _StdcallAlias@4
26
26
; CHECK-NM: U _StdcallFunction@4
Original file line number Diff line number Diff line change @@ -15,14 +15,14 @@ ImpLibName2 = Implementation2 == AltTestFunction2
15
15
ImpLibName3 = kernel32.Sleep
16
16
17
17
; CHECK: U AltTestFunction
18
- ; CHECK-NEXT: w TestFunction
18
+ ; CHECK-NEXT: W TestFunction
19
19
; CHECK: U __imp_AltTestFunction
20
- ; CHECK-NEXT: w __imp_TestFunction
20
+ ; CHECK-NEXT: W __imp_TestFunction
21
21
; CHECK: T ImpLibName
22
22
; CHECK-NEXT: T __imp_ImpLibName
23
23
; CHECK: U AltTestFunction2
24
- ; CHECK-NEXT: w ImpLibName2
24
+ ; CHECK-NEXT: W ImpLibName2
25
25
; CHECK: U __imp_AltTestFunction2
26
- ; CHECK-NEXT: w __imp_ImpLibName2
26
+ ; CHECK-NEXT: W __imp_ImpLibName2
27
27
; CHECK: T ImpLibName3
28
28
; CHECK-NEXT: T __imp_ImpLibName3
You can’t perform that action at this time.
0 commit comments