Rajiv K. Kalia

71 papers A* 1A 10C 3Misc 4Journal 41Unranked 12
YearRankTypeTitle / Venue / Authors
2025 A conf
SC
Taufeq Mohammed Razakh, Thomas Linker, Ye Luo, Nariman Piroozan, Simon John Pennycook, Nalini Kumar, Albert Musaelian, Anders Johansson, Boris Kozinsky, Rajiv K. Kalia, Priya Vashishta, Fuyuki Shimojo, Shinnosuke Hattori, Ken-ichi Nomura, Aiichiro Nakano
2024 conf
IPDPS (Workshops)
Taufeq Mohammed Razakh, Thomas Linker, Ye Luo, Rajiv K. Kalia, Ken-ichi Nomura, Priya Vashishta, Aiichiro Nakano
2024 J jnl
CoRR
Yash Gandhi, Kexin Zheng, Birendra Jha, Ken-ichi Nomura, Aiichiro Nakano, Priya Vashishta, Rajiv K. Kalia
2023 C conf
ISC
Hikaru Ibayashi, Taufeq Mohammed Razakh, Liqiu Yang, Thomas Linker, Marco Olguin, Shinnosuke Hattori, Ye Luo, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2023 J jnl
CoRR
Hikaru Ibayashi, Taufeq Mohammed Razakh, Liqiu Yang, Thomas Linker, Marco Olguin, Shinnosuke Hattori, Ye Luo, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2022 J jnl
CoRR
Kuang Liu, Rajiv K. Kalia, Xinlian Liu, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta, Rafael Zamora-Resendiz
2022 J jnl
J. Chem. Inf. Model.
Beibei Wang, Shane Jackson, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta, Rajiv K. Kalia, Mark Stevens
2021 J jnl
J. Chem. Inf. Model.
Antonina L. Nazarova, Liqiu Yang, Kuang Liu, Ankit Mishra, Rajiv K. Kalia, Ken-ichi Nomura, Aiichiro Nakano, Priya Vashishta, Pankaj Rajak
2021 conf
IPDPS Workshops
Pankaj Rajak, Anikeya Aditya, Shogo Fukushima, Rajiv K. Kalia, Thomas Linker, Kuang Liu, Ye Luo, Aiichiro Nakano, Ken-ichi Nomura, Kohei Shimamura, Fuyuki Shimojo, Priya Vashishta
2021 J jnl
SoftwareX
Connor Powers, Lindsay Bassman, Thomas Linker, Ken-ichi Nomura, Sahil Gulania, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2021 J jnl
SoftwareX
Taufeq Mohammed Razakh, Beibei Wang, Shane Jackson, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2020 J jnl
Comput. Phys. Commun.
Aravind Krishnamoorthy, Ankit Mishra, Nicholas Grabar, Nitish Baradwaj, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2020 conf
IPDPS Workshops
Pankaj Rajak, Kuang Liu, Aravind Krishnamoorthy, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Subodh C. Tiwari, Priya Vashishta
2020 J jnl
CoRR
Taufeq Mohammed Razakh, Beibei Wang, Shane Jackson, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2020 J jnl
CoRR
Pankaj Rajak, Aravind Krishnamoorthy, Ankit Mishra, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2020 C conf
HPC Asia
Subodh C. Tiwari, Aravind Krishnamoorthy, Pankaj Rajak, Putt Sakdhnagool, Manaschai Kunaseth, Fuyuki Shimojo, Shogo Fukushima, Aiichiro Nakano, Ye Luo, Rajiv K. Kalia, Ken-ichi Nomura, Priya Vashishta
2020 J jnl
SoftwareX
Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Pankaj Rajak, Priya Vashishta
2019 J jnl
SoftwareX
Brandon K. Horton, Rajiv K. Kalia, Erick Moen, Aiichiro Nakano, Ken-ichi Nomura, Michael Qian, Priya Vashishta, Anders Hafreager
2019 J jnl
SoftwareX
Fuyuki Shimojo, Shogo Fukushima, Hiroyuki Kumazoe, Masaaki Misawa, Satoshi Ohmura, Pankaj Rajak, Kohei Shimamura, Lindsay Bassman Oftelie, Subodh Tiwari, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2019 J jnl
Comput. Sci. Eng.
Ying Li, Ken-ichi Nomura, Joseph A. Insley, Vitali A. Morozov, Kalyan Kumaran, Nichols A. Romero, William A. Goddard III, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2018 C conf
HPC Asia
Patrick E. Small, Kuang Liu, Subodh Tiwari, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2017 J jnl
Comput. Phys. Commun.
Hye Suk Byun, Mohamed Y. El-Naggar, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2016 conf
SpringSim (HPS)
Ho Ching Cheng, Pankaj Rajak, Chunyang Sheng, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2016 A conf
IPDPS
Patrick E. Small, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2015 J jnl
Comput. Phys. Commun.
Ken-ichi Nomura, Patrick E. Small, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2015 J jnl
Computer
Nichols A. Romero, Aiichiro Nakano, Katherine Riley, Fuyuki Shimojo, Rajiv K. Kalia, Priya Vashishta, Paul C. Messina
2014 A conf
SC
Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Kohei Shimamura, Fuyuki Shimojo, Manaschai Kunaseth, Paul C. Messina, Nichols A. Romero
2013 A conf
SC
Manaschai Kunaseth, Rajiv K. Kalia, Aiichiro Nakano, Ken-ichi Nomura, Priya Vashishta
2013 J jnl
J. Supercomput.
Manaschai Kunaseth, David F. Richards, James N. Glosli, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2013 J jnl
Comput. Phys. Commun.
Fuyuki Shimojo, Satoshi Ohmura, Weiwei Mou, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2013 conf
IPDPS Workshops
Manaschai Kunaseth, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, David F. Richards, James N. Glosli
2013 J jnl
J. Parallel Distributed Comput.
Liu Peng, Guangming Tan, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Dongrui Fan, Hao Zhang, Fenglong Song
2012 J jnl
J. Supercomput.
Hikmet Dursun, Manaschai Kunaseth, Ken-ichi Nomura, Jacqueline Chame, Robert F. Lucas, Chun Chen, Mary W. Hall, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2012 conf
Euro-Par
Manaschai Kunaseth, Ken-ichi Nomura, Hikmet Dursun, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2012 conf
SC Companion
Aaron Knoll, Joseph A. Insley, Michael E. Papka, Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2011 J jnl
J. Supercomput.
Liu Peng, Manaschai Kunaseth, Hikmet Dursun, Ken-ichi Nomura, Weiqiang Wang, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2011 conf
Conf. Computing Frontiers
Liu Peng, Aiichiro Nakano, Guangming Tan, Priya Vashishta, Dongrui Fan, Hao Zhang, Rajiv K. Kalia, Fenglong Song
2010 J jnl
CoRR
Henry Yuen, Fuyuki Shimojo, Kevin J. Zhang, Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2010 conf
CSC
Manaschai Kunaseth, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2010 conf
Euro-Par Workshops
Liu Peng, Guangming Tan, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Dongrui Fan, Ninghui Sun
2009 conf
Euro-Par
Hikmet Dursun, Ken-ichi Nomura, Liu Peng, Richard Seymour, Weiqiang Wang, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2009 Misc conf
PDPTA
Liu Peng, Manaschai Kunaseth, Hikmet Dursun, Ken-ichi Nomura, Weiqiang Wang, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2009 A conf
IPDPS
Ken-ichi Nomura, Richard Seymour, Weiqiang Wang, Hikmet Dursun, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Fuyuki Shimojo, Lin H. Yang
2009 J jnl
Parallel Process. Lett.
Hikmet Dursun, Kevin J. Barker, Darren J. Kerbyson, Scott Pakin, Richard Seymour, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2009 A conf
IPDPS
Liu Peng, Richard Seymour, Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Alexander Loddoch, Michael Netzband, William R. Volz, Chap C. Wong
2009 Misc conf
PDPTA
Hikmet Dursun, Ken-ichi Nomura, Weiqiang Wang, Manaschai Kunaseth, Liu Peng, Richard Seymour, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2008 J jnl
Comput. Phys. Commun.
Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2008 J jnl
Int. J. High Perform. Comput. Appl.
Aiichiro Nakano, Rajiv K. Kalia, Ken-ichi Nomura, Ashish Sharma, Priya Vashishta, Fuyuki Shimojo, Adri C. T. van Duin, William A. Goddard III, Rupak Biswas, Deepak Srivastava, Lin H. Yang
2008 conf
Euro-Par
Liu Peng, Ken-ichi Nomura, Takehiro Oyakawa, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2007 J jnl
Comput. Phys. Commun.
Priya Vashishta, Rajiv K. Kalia, Aiichiro Nakano
2007 J jnl
J. Supercomput.
Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Jorge L. Landa
2006 J jnl
Comput. Phys. Commun.
Cheng Zhang, Bhupesh Bansal, Paulo S. Branicio, Rajiv K. Kalia, Aiichiro Nakano, Ashish Sharma, Priya Vashishta
2006 A conf
SC
Hiroshi Takemiya, Yoshio Tanaka, Satoshi Sekiguchi, Shuji Ogata, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2005 J jnl
Comput. Phys. Commun.
Fuyuki Shimojo, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2005 Misc conf
PDPTA
Ken-ichi Nomura, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Jorge L. Landa
2004 J jnl
Comput. Phys. Commun.
Ashish Sharma, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2003 J jnl
Presence Teleoperators Virtual Environ.
Ashish Sharma, Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta, Sanjay Kodiyalam, Paul Miller, Wei Zhao, Xinlian Liu, Timothy Campbell, Andy Haas
2003 J jnl
Comput. Sci. Eng.
Ashish Sharma, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta
2003 A conf
IPDPS
Hideaki Kikuchi, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Fuyuki Shimojo, Subhash Saini
2002 A conf
SC
Hideaki Kikuchi, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Hiroshi Iyetomi, Shuji Ogata, Takahisa Kouno, Fuyuki Shimojo, Kenji Tsuruta, Subhash Saini
2002 A* conf
VR
Ashish Sharma, Xinlian Liu, Paul Miller, Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta, Wei Zhao, Timothy Campbell, Andy Haas
2002 Misc conf
HiPC
Priya Vashishta, Rajiv K. Kalia, Aiichiro Nakano
2002 J jnl
Sci. Program.
Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta, Timothy Campbell, Shuji Ogata, Fuyuki Shimojo, Subhash Saini
2001 J jnl
Comput. Sci. Eng.
Aiichiro Nakano, Martina E. Bachlechner, Rajiv K. Kalia, Elefterios Lidorikis, Priya Vashishta, George Z. Voyiadjis, Timothy Campbell, Shuji Ogata, Fuyuki Shimojo
2001 A conf
SC
Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta, Timothy Campbell, Shuji Ogata, Fuyuki Shimojo, Subhash Saini
2000 J jnl
Future Gener. Comput. Syst.
Fuyuki Shimojo, Timothy Campbell, Rajiv K. Kalia, Aiichiro Nakano, Priya Vashishta, Shuji Ogata, Kenji Tsuruta
1999 J jnl
Comput. Sci. Eng.
Priya Vashishta, Rajiv K. Kalia, Aiichiro Nakano
1999 J jnl
Comput. Sci. Eng.
Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta
1998 J jnl
VLSI Design
Aiichiro Nakano, Rajiv K. Kalia, Priya Vashishta
1990 J jnl
Int. J. High Perform. Comput. Appl.
Rajiv K. Kalia, Priya Vashishta, Lin H. Yang, Fred W. Dech, John Rowlan
1989 J jnl
Int. J. High Speed Comput.
D. L. Greenwell, Rajiv K. Kalia, J. C. Patterson, Priya Vashishta
redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.java
← Index redb/extractors/decompiler/_archive/GhidraDecompilerScript-v2.java java
import ghidra.app.script.GhidraScript;
import ghidra.program.model.listing.*;
import ghidra.app.decompiler.*;
import ghidra.program.model.block.*;
import ghidra.program.model.symbol.*;
import ghidra.program.model.pcode.*;
import ghidra.program.model.address.*;
import org.json.JSONObject;
import org.json.JSONArray;
import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;

public class GhidraDecompilerScript extends GhidraScript {
    private DecompInterface decompInterface;
    private BasicBlockModel basicBlockModel;

    @Override
    public void run() throws Exception {
        System.err.println("{\"debug\": \"Script starting\"}");

        // Get binary hash and filepath from arguments
        String[] args = getScriptArgs();
        if (args.length < 2) {
            System.err.println("{\"error\": \"Both SHA256 and filepath arguments are required\"}");
            return;
        }
        String sha256 = args[0];
        String filepath = args[1];

        // Add debug output after setup
        System.err.println("{\"debug\": \"Processing file: " + args[1] + "\"}");

        // Initialize analysis components
        setupDecompiler();
        basicBlockModel = new BasicBlockModel(currentProgram);

        // Create the main JSON object for output
        JSONObject output = new JSONObject();
        output.put("sha256", sha256);
        output.put("decompiled", new JSONArray());
        output.put("disassembled", new JSONArray());
        output.put("cfg", new JSONArray());

        // Process all functions
        FunctionIterator functions = currentProgram.getFunctionManager().getFunctions(true);
        for (Function function : functions) {
            processFunction(function, output);
        }

        System.err.println("{\"debug\": \"Preparing final output\"}");
        // Output the final JSON to stdout
        System.out.println(output.toString());
    }

    private void setupDecompiler() {
        decompInterface = new DecompInterface();
        DecompileOptions options = new DecompileOptions();
        decompInterface.setOptions(options);
        decompInterface.openProgram(currentProgram);
    }

    private void processFunction(Function function, JSONObject output) {
        try {
            Address entry = function.getEntryPoint();
            String functionName = function.getName();
            String functionAddress = entry.toString();

            // Process each analysis type independently
            boolean hasAnyResults = false;

            try {
                if (processDecompiledCode(function, output.getJSONArray("decompiled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Decompilation failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processDisassembledCode(function, output.getJSONArray("disassembled"),
                                        functionName, functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"Disassembly failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            try {
                if (processCFG(function, output.getJSONArray("cfg"), functionAddress)) {
                    hasAnyResults = true;
                }
            } catch (Exception e) {
                System.err.println(String.format(
                    "{\"error\": \"CFG extraction failed for function %s: %s\"}",
                    functionName, e.getMessage().replace("\"", "'")));
            }

            if (!hasAnyResults) {
                System.err.println(String.format(
                    "{\"warning\": \"No results obtained for function %s\"}",
                    functionName));
            }

        } catch (Exception e) {
            System.err.println(String.format(
                "{\"error\": \"Failed to process function: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
    }

    private boolean processDecompiledCode(Function function, JSONArray decompArray,
                                        String functionName, String functionAddress) {
        try {
            DecompileResults results = decompInterface.decompileFunction(function, 30, monitor);
            if (results == null || !results.decompileCompleted()) {
                System.err.println(String.format(
                    "{\"warning\": \"Decompilation incomplete for function %s\"}",
                    functionName));
                return false;
            }

            String decompiledCode = results.getDecompiledFunction().getC();
            if (decompiledCode == null || decompiledCode.trim().isEmpty()) {
                System.err.println(String.format(
                    "{\"warning\": \"Empty decompilation result for function %s\"}",
                    functionName));
                return false;
            }

            String contentHash = calculateHash(decompiledCode);

            JSONObject functionObj = new JSONObject();
            functionObj.put("decompiled_content_hash", contentHash);
            functionObj.put("decompiled_function_name", functionName);
            functionObj.put("decompiled_function_address", functionAddress);
            functionObj.put("decompiled_function", decompiledCode);

            decompArray.put(functionObj);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Decompilation error: " + e.getMessage(), e);
        }
    }

    private boolean processDisassembledCode(Function function, JSONArray disasmArray,
                                        String functionName, String functionAddress) {
        try {
            StringBuilder disassembly = new StringBuilder();
            StringBuilder normalized = new StringBuilder();
            int instructionCount = 0;
            boolean hasValidInstructions = false;

            Listing listing = currentProgram.getListing();
            AddressSetView functionBody = function.getBody();
            InstructionIterator instructions = listing.getInstructions(functionBody, true);

            while (instructions.hasNext()) {
                try {
                    Instruction instr = instructions.next();
                    if (instr != null) {
                        String disasmLine = instr.toString();
                        if (disasmLine != null && !disasmLine.trim().isEmpty()) {
                            disassembly.append(disasmLine).append("\n");
                            normalized.append(normalizeInstruction(disasmLine)).append("\n");
                            instructionCount++;
                            hasValidInstructions = true;
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction in %s: %s\"}",
                        functionName, e.getMessage().replace("\"", "'")));
                }
            }

            if (!hasValidInstructions) {
                System.err.println(String.format(
                    "{\"warning\": \"No valid instructions found in function %s\"}",
                    functionName));
                return false;
            }

            String disassembledCode = disassembly.toString();
            String contentHash = calculateHash(disassembledCode);

            JSONObject functionObj = new JSONObject();
            functionObj.put("disassembled_content_hash", contentHash);
            functionObj.put("disassembled_function_name", functionName);
            functionObj.put("disassembled_function_address", functionAddress);
            functionObj.put("disassembled_function", disassembledCode);
            functionObj.put("normalized_disassembly", normalized.toString());
            functionObj.put("instruction_count", instructionCount);

            // Initialize similarity fields as null
            functionObj.put("minhash_signature", JSONObject.NULL);
            functionObj.put("opcode_frequency_vector", JSONObject.NULL);
            functionObj.put("api_calls_vector", JSONObject.NULL);
            functionObj.put("instruction_embedding", JSONObject.NULL);

            disasmArray.put(functionObj);
            return true;

        } catch (Exception e) {
            throw new RuntimeException("Disassembly error: " + e.getMessage(), e);
        }
    }

    private boolean processCFG(Function function, JSONArray cfgArray, String functionAddress) {
        try {
            CodeBlockIterator blocks = basicBlockModel.getCodeBlocksContaining(
                function.getBody(), monitor);

            boolean hasValidBlocks = false;

            while (blocks.hasNext()) {
                try {
                    CodeBlock block = blocks.next();
                    String blockInstructions = getBlockInstructions(block);

                    if (blockInstructions == null || blockInstructions.trim().isEmpty()) {
                        continue;
                    }

                    String blockId = calculateHash(blockInstructions);

                    JSONObject blockObj = new JSONObject();
                    blockObj.put("block_id", blockId);
                    blockObj.put("function_address", functionAddress);
                    blockObj.put("block_instructions", blockInstructions);

                    // Process successors with error handling
                    JSONArray successorAddresses = new JSONArray();
                    try {
                        CodeBlockReferenceIterator successors = block.getDestinations(monitor);
                        while (successors.hasNext()) {
                            try {
                                CodeBlockReference ref = successors.next();
                                if (ref != null && ref.getDestinationAddress() != null) {
                                    successorAddresses.put(ref.getDestinationAddress().toString());
                                }
                            } catch (Exception e) {
                                System.err.println(String.format(
                                    "{\"warning\": \"Skipped invalid successor in block %s: %s\"}",
                                    blockId, e.getMessage().replace("\"", "'")));
                            }
                        }
                    } catch (Exception e) {
                        System.err.println(String.format(
                            "{\"warning\": \"Error processing successors for block %s: %s\"}",
                            blockId, e.getMessage().replace("\"", "'")));
                    }

                    blockObj.put("successor_blocks", successorAddresses);
                    cfgArray.put(blockObj);
                    hasValidBlocks = true;

                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid block in function %s: %s\"}",
                        functionAddress, e.getMessage().replace("\"", "'")));
                }
            }

            return hasValidBlocks;

        } catch (Exception e) {
            throw new RuntimeException("CFG extraction error: " + e.getMessage(), e);
        }
    }

    private String getBlockInstructions(CodeBlock block) {
        StringBuilder instructions = new StringBuilder();
        try {
            AddressIterator addresses = block.getAddresses(true);
            while (addresses.hasNext()) {
                try {
                    Address addr = addresses.next();
                    if (addr != null) {
                        Instruction instr = currentProgram.getListing().getInstructionAt(addr);
                        if (instr != null) {
                            instructions.append(instr.toString()).append("\n");
                        }
                    }
                } catch (Exception e) {
                    System.err.println(String.format(
                        "{\"warning\": \"Skipped invalid instruction at address %s: %s\"}",
                        addresses.next(), e.getMessage().replace("\"", "'")));
                }
            }
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error getting block instructions: %s\"}",
                e.getMessage().replace("\"", "'")));
        }
        return instructions.toString();
    }

    private String normalizeInstruction(String instruction) {
        try {
            if (instruction == null || instruction.trim().isEmpty()) {
                return "";
            }
            return instruction.replaceAll("0x[0-9a-fA-F]+", "IMM")
                            .replaceAll("\\b\\d+\\b", "NUM")
                            .replaceAll("[\\[\\]\\+\\-\\*/%&|^]+", "_OP_");
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"warning\": \"Error normalizing instruction: %s\"}",
                e.getMessage().replace("\"", "'")));
            return instruction;
        }
    }

    private String calculateHash(String content) {
        try {
            if (content == null || content.trim().isEmpty()) {
                return "";
            }
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(content.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02x", b));
            }
            return hexString.toString();
        } catch (Exception e) {
            System.err.println(String.format(
                "{\"error\": \"Error calculating hash: %s\"}",
                e.getMessage().replace("\"", "'")));
            return "";
        }
    }
}