summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/RiscV/ElfWriter.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-10-08 17:29:08 +0200
committerEugen Wissner <belka@caraus.de>2024-10-09 23:37:58 +0200
commit87f183baad01f2b572f5f9051895b5876a56dd4c (patch)
tree638bc5449ae12125d2d943b003212424e0bb66ba /lib/Language/Elna/RiscV/ElfWriter.hs
parent699cc8684b1571d2501bac2c8bdf461127a420a1 (diff)
downloadelna-87f183baad01f2b572f5f9051895b5876a56dd4c.tar.gz
Add branch relocation type
Diffstat (limited to 'lib/Language/Elna/RiscV/ElfWriter.hs')
-rw-r--r--lib/Language/Elna/RiscV/ElfWriter.hs23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/Language/Elna/RiscV/ElfWriter.hs b/lib/Language/Elna/RiscV/ElfWriter.hs
index a83aca3..d3b0e94 100644
--- a/lib/Language/Elna/RiscV/ElfWriter.hs
+++ b/lib/Language/Elna/RiscV/ElfWriter.hs
@@ -41,7 +41,7 @@ import Language.Elna.Object.Elf
)
import System.IO (Handle)
import qualified Language.Elna.Architecture.RiscV as RiscV
-import qualified Data.Text.Encoding as Text.Encoding
+import qualified Data.Text.Encoding as Text
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Trans.State (get)
import Language.Elna.RiscV.CodeGenerator (Statement(..))
@@ -238,7 +238,7 @@ riscv32Elf code objectHandle = text
result =
( encoded <> encoded'
, relocations <> relocations'
- , ElfHeaderResult (names <> labelName <> "\0") (Vector.snoc symbols newEntry)
+ , ElfHeaderResult (names <> Text.encodeUtf8 labelName <> "\0") (Vector.snoc symbols newEntry)
, definitions'
)
in encodeAsm shndx result rest'
@@ -248,18 +248,21 @@ riscv32Elf code objectHandle = text
let offset = fromIntegral $ LazyByteString.length encoded
unresolvedRelocation = case instruction of
RiscV.RelocatableInstruction _ instructionType
- | RiscV.Higher20 _ symbolName <- instructionType
+ | RiscV.RHigher20 _ symbolName <- instructionType
-> Just -- R_RISCV_HI20
- $ UnresolvedRelocation (Text.Encoding.encodeUtf8 symbolName) offset 26
- | RiscV.Lower12I _ _ _ symbolName <- instructionType
+ $ UnresolvedRelocation (Text.encodeUtf8 symbolName) offset 26
+ | RiscV.RLower12I _ _ _ symbolName <- instructionType
-> Just -- R_RISCV_LO12_I
- $ UnresolvedRelocation (Text.Encoding.encodeUtf8 symbolName) offset 27
- | RiscV.Lower12S symbolName _ _ _ <- instructionType
+ $ UnresolvedRelocation (Text.encodeUtf8 symbolName) offset 27
+ | RiscV.RLower12S symbolName _ _ _ <- instructionType
-> Just -- R_RISCV_LO12_S
- $ UnresolvedRelocation (Text.Encoding.encodeUtf8 symbolName) offset 28
+ $ UnresolvedRelocation (Text.encodeUtf8 symbolName) offset 28
+ | RiscV.RBranch symbolName _ _ _ <- instructionType
+ -> Just -- R_RISCV_BRANCH
+ $ UnresolvedRelocation (Text.encodeUtf8 symbolName) offset 16
RiscV.CallInstruction symbolName
-> Just -- R_RISCV_CALL_PLT
- $ UnresolvedRelocation (Text.Encoding.encodeUtf8 symbolName) offset 19
+ $ UnresolvedRelocation (Text.encodeUtf8 symbolName) offset 19
RiscV.BaseInstruction _ _ -> Nothing
chunk = ByteString.Builder.toLazyByteString
$ RiscV.instruction instruction
@@ -270,7 +273,7 @@ riscv32Elf code objectHandle = text
, addDefinition unresolvedRelocation definitions
)
in encodeInstructions result
- | otherwise = (encoded, relocations, Vector.drop 1 instructions, definitions)
+ | otherwise = (encoded, relocations, instructions, definitions)
addDefinition (Just (UnresolvedRelocation symbolName _ _)) =
HashSet.insert symbolName
addDefinition Nothing = id