From f86060f45a96438e8d068cca192097f5e1ddc37d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 22 Apr 2003 20:19:52 +0000 Subject: [PATCH] Add support for the switch instruction to the CWriter llvm-svn: 5847 --- llvm/lib/CWriter/Writer.cpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/llvm/lib/CWriter/Writer.cpp b/llvm/lib/CWriter/Writer.cpp index 88e0a264a9c4..6fe00ee1afcd 100644 --- a/llvm/lib/CWriter/Writer.cpp +++ b/llvm/lib/CWriter/Writer.cpp @@ -7,11 +7,7 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/iMemory.h" -#include "llvm/iTerminators.h" -#include "llvm/iPHINode.h" -#include "llvm/iOther.h" -#include "llvm/iOperators.h" +#include "llvm/Instructions.h" #include "llvm/Pass.h" #include "llvm/SymbolTable.h" #include "llvm/SlotCalculator.h" @@ -108,6 +104,7 @@ namespace { void visitReturnInst(ReturnInst &I); void visitBranchInst(BranchInst &I); + void visitSwitchInst(SwitchInst &I); void visitPHINode(PHINode &I) {} void visitBinaryOperator(Instruction &I); @@ -156,8 +153,8 @@ static string makeNameProper(string x) { string CWriter::getValueName(const Value *V) { if (V->hasName()) { // Print out the label if it exists... if (isa(V) && // Do not mangle globals... - cast(V)->hasExternalLinkage())// && // Unless it's internal or - //!MangledGlobals.count(V)) // Unless the name would collide if we don't + cast(V)->hasExternalLinkage()) // Unless it's internal or + //!MangledGlobals.count(V)) // Unless the name would collide if we don't return makeNameProper(V->getName()); return "l" + utostr(V->getType()->getUniqueID()) + "_" + @@ -867,6 +864,25 @@ void CWriter::visitReturnInst(ReturnInst &I) { Out << ";\n"; } +void CWriter::visitSwitchInst(SwitchInst &SI) { + Out << " switch ("; + writeOperand(SI.getOperand(0)); + Out << ") {\n default: goto "; + writeOperand(SI.getDefaultDest()); + Out << ";\n"; + for (unsigned i = 2, e = SI.getNumOperands(); i != e; i += 2) { + Out << " case "; + writeOperand(SI.getOperand(i)); + Out << ":\n"; + BasicBlock *Succ = cast(SI.getOperand(i+1)); + printBranchToBlock(SI.getParent(), Succ, 2); + if (Succ == SI.getParent()->getNext()) + Out << " break;\n"; + } + Out << " }\n"; +} + + static bool isGotoCodeNeccessary(BasicBlock *From, BasicBlock *To) { // If PHI nodes need copies, we need the copy code... if (isa(To->front()) ||