aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-09-05 18:28:10 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-09-05 18:28:10 +0000
commit537a8779989645705c60c9577c913bb7d00b0239 (patch)
treee857889ac3041146bc52b172397b428f504d71a5 /lib/Target
parent20d4129fefb07f6c5619045372ebe7a9f5c139e1 (diff)
downloadexternal_llvm-537a8779989645705c60c9577c913bb7d00b0239.zip
external_llvm-537a8779989645705c60c9577c913bb7d00b0239.tar.gz
external_llvm-537a8779989645705c60c9577c913bb7d00b0239.tar.bz2
-- Bug fix: use byte offsets not typed offsets in output assembly!
-- Add support for ConstantExpr constants (only cast and add operators so far) -- Avoid generating label Bbss.bss, which sometimes came out twice. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3578 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/SparcV9/SparcV9AsmPrinter.cpp43
1 files changed, 24 insertions, 19 deletions
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
index f3de79d..c384921 100644
--- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
+++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
@@ -107,7 +107,7 @@ public:
case Text: toAsm << "\".text\""; break;
case ReadOnlyData: toAsm << "\".rodata\",#alloc"; break;
case InitRWData: toAsm << "\".data\",#alloc,#write"; break;
- case UninitRWData: toAsm << "\".bss\",#alloc,#write\nBbss.bss:"; break;
+ case UninitRWData: toAsm << "\".bss\",#alloc,#write"; break;
}
toAsm << "\n";
}
@@ -186,30 +186,36 @@ public:
return "";
}
- // ConstantExprToString() - Convert a ConstantExpr to a C expression, and
- // return this as a string.
- //
+ // ConstantExprToString() - Convert a ConstantExpr to an asm expression
+ // and return this as a string.
std::string ConstantExprToString(const ConstantExpr* CE,
const TargetMachine& target) {
std::string S;
switch(CE->getOpcode()) {
case Instruction::GetElementPtr:
- {
+ { // generate a symbolic expression for the byte address
const Value* ptrVal = CE->getOperand(0);
- valToExprString(ptrVal, target, S);
std::vector<Value*> idxVec(CE->op_begin()+1, CE->op_end());
- uint64_t byteOffset =
- target.DataLayout.getIndexedOffset(ptrVal->getType(), idxVec);
-
- const Type *PtrElTy =
- cast<PointerType>(ptrVal->getType())->getElementType();
- uint64_t eltSize = target.DataLayout.getTypeSize(PtrElTy);
-
- S += " + " + utostr(byteOffset / eltSize);
+ S += "(" + valToExprString(ptrVal, target) + ") + ("
+ + utostr(target.DataLayout.getIndexedOffset(ptrVal->getType(),idxVec))
+ + ")";
break;
}
+ case Instruction::Cast:
+ // Support only non-converting casts for now, i.e., a no-op.
+ // This assertion is not a complete check.
+ assert(target.DataLayout.getTypeSize(CE->getType()) ==
+ target.DataLayout.getTypeSize(CE->getOperand(0)->getType()));
+ S += "(" + valToExprString(CE->getOperand(0), target) + ")";
+ break;
+
+ case Instruction::Add:
+ S += "(" + valToExprString(CE->getOperand(0), target) + ") + ("
+ + valToExprString(CE->getOperand(1), target) + ")";
+ break;
+
default:
assert(0 && "Unsupported operator in ConstantExprToString()");
break;
@@ -221,8 +227,8 @@ public:
// valToExprString - Helper function for ConstantExprToString().
// Appends result to argument string S.
//
- void valToExprString(const Value* V, const TargetMachine& target,
- std::string& S) {
+ std::string valToExprString(const Value* V, const TargetMachine& target) {
+ std::string S;
bool failed = false;
if (const Constant* CV = dyn_cast<Constant>(V)) { // symbolic or known
@@ -237,7 +243,7 @@ public:
else if (isa<ConstantPointerNull>(CV))
S += "0";
else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(CV))
- valToExprString(CPR->getValue(), target, S);
+ S += valToExprString(CPR->getValue(), target);
else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV))
S += ConstantExprToString(CE, target);
else
@@ -253,6 +259,7 @@ public:
assert(0 && "Cannot convert value to string");
S += "<illegal-value>";
}
+ return S;
}
};
@@ -861,8 +868,6 @@ void SparcModuleAsmPrinter::emitGlobalsAndConstants(const Module &M) {
if (GI->hasInitializer() && GI->isConstant()) {
enterSection(AsmPrinter::ReadOnlyData); // read-only, initialized data
} else if (GI->hasInitializer() && !GI->isConstant()) { // read-write data
- enterSection(AsmPrinter::ReadOnlyData); // read-only, initialized data
- } else if (GI->hasInitializer() && !GI->isConstant()) { // read-write data
enterSection(AsmPrinter::InitRWData);
} else {
assert (!GI->hasInitializer() && "Unexpected global variable type found");