summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-09-23 16:59:10 +0000
committerDan Gohman <dan433584@gmail.com>2015-09-23 16:59:10 +0000
commit979840d31fab3d8597e618e7a1b89b13f838079b (patch)
tree30a09f7603f10d6c0ddfdf884271cf4ff44cef86 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
parent2812aa82d0cd9d626e4da81b5cf90dd3068aa3cc (diff)
downloadbcm5719-llvm-979840d31fab3d8597e618e7a1b89b13f838079b.tar.gz
bcm5719-llvm-979840d31fab3d8597e618e7a1b89b13f838079b.zip
[WebAssembly] Fix hasAddr64 being used before being initializer.
This reverts r248388 and fixes the underlying bug: hasAddr64 was initialized in runOnMachineFunction, but runOnMachineFunction isn't ever called in CodeGen/WebAssembly/global.ll since that testcase has no functions. The fix here is to use AsmPrinter's getPointerSize() as needed to determine the pointer size instead. llvm-svn: 248394
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp56
1 files changed, 36 insertions, 20 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index f28d2e60826..9c5899991c7 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -40,12 +40,11 @@ using namespace llvm;
namespace {
class WebAssemblyAsmPrinter final : public AsmPrinter {
- bool hasAddr64;
const WebAssemblyInstrInfo *TII;
public:
WebAssemblyAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
- : AsmPrinter(TM, std::move(Streamer)), hasAddr64(false), TII(nullptr) {}
+ : AsmPrinter(TM, std::move(Streamer)), TII(nullptr) {}
private:
const char *getPassName() const override {
@@ -62,7 +61,6 @@ private:
bool runOnMachineFunction(MachineFunction &MF) override {
const auto &Subtarget = MF.getSubtarget<WebAssemblySubtarget>();
- hasAddr64 = Subtarget.hasAddr64();
TII = Subtarget.getInstrInfo();
return AsmPrinter::runOnMachineFunction(MF);
}
@@ -80,6 +78,9 @@ private:
void EmitFunctionBodyEnd() override;
void EmitInstruction(const MachineInstr *MI) override;
+
+ static std::string toString(const APFloat &APF);
+ const char *toString(Type *Ty) const;
};
} // end anonymous namespace
@@ -101,7 +102,7 @@ static SmallString<32> OpcodeName(const WebAssemblyInstrInfo *TII,
static std::string toSymbol(StringRef S) { return ("$" + S).str(); }
-static std::string toString(const APFloat &FP) {
+std::string WebAssemblyAsmPrinter::toString(const APFloat &FP) {
static const size_t BufBytes = 128;
char buf[BufBytes];
if (FP.isNaN())
@@ -118,20 +119,37 @@ static std::string toString(const APFloat &FP) {
return buf;
}
-static const char *toString(const Type *Ty, bool hasAddr64) {
+const char *WebAssemblyAsmPrinter::toString(Type *Ty) const {
switch (Ty->getTypeID()) {
- default: break;
+ default:
+ break;
// Treat all pointers as the underlying integer into linear memory.
- case Type::PointerTyID: return hasAddr64 ? "i64" : "i32";
- case Type::FloatTyID: return "f32";
- case Type::DoubleTyID: return "f64";
+ case Type::PointerTyID:
+ switch (getPointerSize()) {
+ case 4:
+ return "i32";
+ case 8:
+ return "i64";
+ default:
+ llvm_unreachable("unsupported pointer size");
+ }
+ break;
+ case Type::FloatTyID:
+ return "f32";
+ case Type::DoubleTyID:
+ return "f64";
case Type::IntegerTyID:
switch (Ty->getIntegerBitWidth()) {
- case 8: return "i8";
- case 16: return "i16";
- case 32: return "i32";
- case 64: return "i64";
- default: break;
+ case 8:
+ return "i8";
+ case 16:
+ return "i16";
+ case 32:
+ return "i32";
+ case 64:
+ return "i64";
+ default:
+ break;
}
}
DEBUG(dbgs() << "Invalid type "; Ty->print(dbgs()); dbgs() << '\n');
@@ -139,7 +157,6 @@ static const char *toString(const Type *Ty, bool hasAddr64) {
return "<invalid>";
}
-
//===----------------------------------------------------------------------===//
// WebAssemblyAsmPrinter Implementation.
//===----------------------------------------------------------------------===//
@@ -195,8 +212,7 @@ void WebAssemblyAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
return;
}
- OS << "(global " << toSymbol(Name) << ' '
- << toString(Init->getType(), hasAddr64) << ' ';
+ OS << "(global " << toSymbol(Name) << ' ' << toString(Init->getType()) << ' ';
if (const auto *C = dyn_cast<ConstantInt>(Init)) {
assert(C->getBitWidth() <= 64 && "Printing wider types unimplemented");
OS << C->getZExtValue();
@@ -241,12 +257,12 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() {
SmallString<128> Str;
raw_svector_ostream OS(Str);
const Function *F = MF->getFunction();
- const Type *Rt = F->getReturnType();
+ Type *Rt = F->getReturnType();
if (!Rt->isVoidTy() || !F->arg_empty()) {
for (const Argument &A : F->args())
- OS << " (param " << toString(A.getType(), hasAddr64) << ')';
+ OS << " (param " << toString(A.getType()) << ')';
if (!Rt->isVoidTy())
- OS << " (result " << toString(Rt, hasAddr64) << ')';
+ OS << " (result " << toString(Rt) << ')';
OutStreamer->EmitRawText(OS.str());
}
}
OpenPOWER on IntegriCloud