[WebAssembly] Explicily disable comdat support for wasm output

For now at least.  We clearly need some kind of comdat or
linkonce_odr support for wasm but currently COMDAT is not
supported.

Disable COMDAT support in the same way we do the Mach-O.  This
also causes clang not to generated COMDATs.

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

llvm-svn: 318123
This commit is contained in:
Sam Clegg 2017-11-14 00:49:16 +00:00
parent e41151965f
commit 999660761e
4 changed files with 19 additions and 13 deletions

View File

@ -661,7 +661,9 @@ public:
}
/// Tests wether the target supports comdat
bool supportsCOMDAT() const { return !isOSBinFormatMachO(); }
bool supportsCOMDAT() const {
return !isOSBinFormatMachO() && !isOSBinFormatWasm();
}
/// @}
/// @name Mutators

View File

@ -1825,10 +1825,10 @@ Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
auto *GO = dyn_cast<GlobalObject>(V);
if (GO) {
if (GO->getComdat() == reinterpret_cast<Comdat *>(1)) {
if (TT.isOSBinFormatMachO())
GO->setComdat(nullptr);
else
if (TT.supportsCOMDAT())
GO->setComdat(TheModule->getOrInsertComdat(V->getName()));
else
GO->setComdat(nullptr);
}
}
return V;

View File

@ -1233,21 +1233,21 @@ void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal(
// Wasm
//===----------------------------------------------------------------------===//
static const Comdat *getWasmComdat(const GlobalValue *GV) {
static void checkWasmComdat(const GlobalValue *GV) {
const Comdat *C = GV->getComdat();
if (!C)
return nullptr;
return;
if (C->getSelectionKind() != Comdat::Any)
report_fatal_error("Wasm COMDATs only support SelectionKind::Any, '" +
C->getName() + "' cannot be lowered.");
return C;
// TODO(sbc): At some point we may need COMDAT support but currently
// they are not supported.
report_fatal_error("WebAssembly doesn't support COMDATs, '" + C->getName() +
"' cannot be lowered.");
}
MCSection *TargetLoweringObjectFileWasm::getExplicitSectionGlobal(
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
StringRef Name = GO->getSection();
checkWasmComdat(GO);
return getContext().getWasmSection(Name, SectionKind::getData());
}
@ -1255,8 +1255,7 @@ static MCSectionWasm *selectWasmSectionForGlobal(
MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID) {
StringRef Group = "";
if (getWasmComdat(GO))
llvm_unreachable("comdat not yet supported for wasm");
checkWasmComdat(GO);
bool UniqueSectionNames = TM.getUniqueSectionNames();
SmallString<128> Name = getSectionPrefixForGlobal(Kind);

View File

@ -0,0 +1,5 @@
; RUN: not llc -mtriple wasm32-unknown-unknown-wasm %s 2>&1 | FileCheck %s
$f = comdat any
@f = global i32 0, comdat
; CHECK: LLVM ERROR: WebAssembly doesn't support COMDATs, 'f' cannot be lowered.