summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>2014-01-26 05:13:44 +0000
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>2014-01-26 05:13:44 +0000
commit4d130cbd77d70047fd01eea0a4b82bc36d15b741 (patch)
tree426e189e9ee12d7221d010970d4388273e98d435 /include
parent7c44f63f898ae8d83ce8faea7fbf19fd5aa3f17a (diff)
downloadllvm-4d130cbd77d70047fd01eea0a4b82bc36d15b741.tar.gz
llvm-4d130cbd77d70047fd01eea0a4b82bc36d15b741.tar.bz2
llvm-4d130cbd77d70047fd01eea0a4b82bc36d15b741.tar.xz
[Sparc] Add support for parsing DW_CFA_GNU_window_save.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200127 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Object/RelocVisitor.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h
index d24cbd464d..2e1d43e26a 100644
--- a/include/llvm/Object/RelocVisitor.h
+++ b/include/llvm/Object/RelocVisitor.h
@@ -123,6 +123,27 @@ public:
HasError = true;
return RelocToApply();
}
+ } else if (FileFormat == "ELF32-sparc") {
+ switch (RelocType) {
+ case llvm::ELF::R_SPARC_32:
+ case llvm::ELF::R_SPARC_UA32:
+ return visitELF_SPARC_32(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ } else if (FileFormat == "ELF64-sparc") {
+ switch (RelocType) {
+ case llvm::ELF::R_SPARC_32:
+ case llvm::ELF::R_SPARC_UA32:
+ return visitELF_SPARCV9_32(R, Value);
+ case llvm::ELF::R_SPARC_64:
+ case llvm::ELF::R_SPARC_UA64:
+ return visitELF_SPARCV9_64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
}
HasError = true;
return RelocToApply();
@@ -272,6 +293,22 @@ private:
int64_t Addend = getAddend64BE(R);
return RelocToApply(Value + Addend, 8);
}
+
+ RelocToApply visitELF_SPARC_32(RelocationRef R, uint32_t Value) {
+ int32_t Addend = getAddend32BE(R);
+ return RelocToApply(Value + Addend, 4);
+ }
+
+ RelocToApply visitELF_SPARCV9_32(RelocationRef R, uint64_t Value) {
+ int32_t Addend = getAddend64BE(R);
+ return RelocToApply(Value + Addend, 4);
+ }
+
+ RelocToApply visitELF_SPARCV9_64(RelocationRef R, uint64_t Value) {
+ int64_t Addend = getAddend64BE(R);
+ return RelocToApply(Value + Addend, 8);
+ }
+
};
}