return new (Alloc) Undefined(Name);
return new (Alloc) DefinedRegular(Name);
case STB_WEAK:
- // FIXME: add support for weak undefined
+ if (Sym->isUndefined())
+ return new (Alloc) UndefinedWeak(Name);
return new (Alloc) DefinedWeak(Name);
}
}
return 0;
case DefinedWeakKind:
case UndefinedKind:
+ case UndefinedWeakKind:
return 1;
}
llvm_unreachable("unknown symbol kind");
DefinedRegularKind = 0,
DefinedWeakKind = 1,
DefinedLast = 1,
- UndefinedKind = 2
+ UndefinedWeakKind = 2,
+ UndefinedKind = 3
};
Kind kind() const { return static_cast<Kind>(SymbolKind); }
}
};
+class UndefinedWeak : public SymbolBody {
+public:
+ explicit UndefinedWeak(StringRef N) : SymbolBody(UndefinedWeakKind, N) {}
+
+ static bool classof(const SymbolBody *S) {
+ return S->kind() == UndefinedWeakKind;
+ }
+};
+
} // namespace elf2
} // namespace lld
foo:
.long bar
+
+.weak zed
+.long zed