xref: /aosp_15_r20/external/llvm/lib/Object/SymbolicFile.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- SymbolicFile.cpp - Interface that only provides symbols --*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines a file format independent SymbolicFile class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/COFF.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/COFFImportFile.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/IRObjectFile.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/SymbolicFile.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker using namespace object;
23*9880d681SAndroid Build Coastguard Worker 
SymbolicFile(unsigned int Type,MemoryBufferRef Source)24*9880d681SAndroid Build Coastguard Worker SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source)
25*9880d681SAndroid Build Coastguard Worker     : Binary(Type, Source) {}
26*9880d681SAndroid Build Coastguard Worker 
~SymbolicFile()27*9880d681SAndroid Build Coastguard Worker SymbolicFile::~SymbolicFile() {}
28*9880d681SAndroid Build Coastguard Worker 
createSymbolicFile(MemoryBufferRef Object,sys::fs::file_magic Type,LLVMContext * Context)29*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<SymbolicFile>> SymbolicFile::createSymbolicFile(
30*9880d681SAndroid Build Coastguard Worker     MemoryBufferRef Object, sys::fs::file_magic Type, LLVMContext *Context) {
31*9880d681SAndroid Build Coastguard Worker   StringRef Data = Object.getBuffer();
32*9880d681SAndroid Build Coastguard Worker   if (Type == sys::fs::file_magic::unknown)
33*9880d681SAndroid Build Coastguard Worker     Type = sys::fs::identify_magic(Data);
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker   switch (Type) {
36*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::bitcode:
37*9880d681SAndroid Build Coastguard Worker     if (Context)
38*9880d681SAndroid Build Coastguard Worker       return errorOrToExpected(IRObjectFile::create(Object, *Context));
39*9880d681SAndroid Build Coastguard Worker   // Fallthrough
40*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::unknown:
41*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::archive:
42*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_universal_binary:
43*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::windows_resource:
44*9880d681SAndroid Build Coastguard Worker     return errorCodeToError(object_error::invalid_file_type);
45*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::elf:
46*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::elf_executable:
47*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::elf_shared_object:
48*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::elf_core:
49*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_executable:
50*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
51*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_core:
52*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_preload_executable:
53*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
54*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_dynamic_linker:
55*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_bundle:
56*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
57*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_dsym_companion:
58*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_kext_bundle:
59*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::pecoff_executable:
60*9880d681SAndroid Build Coastguard Worker     return ObjectFile::createObjectFile(Object, Type);
61*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::coff_import_library:
62*9880d681SAndroid Build Coastguard Worker     return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object));
63*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::elf_relocatable:
64*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::macho_object:
65*9880d681SAndroid Build Coastguard Worker   case sys::fs::file_magic::coff_object: {
66*9880d681SAndroid Build Coastguard Worker     Expected<std::unique_ptr<ObjectFile>> Obj =
67*9880d681SAndroid Build Coastguard Worker         ObjectFile::createObjectFile(Object, Type);
68*9880d681SAndroid Build Coastguard Worker     if (!Obj || !Context)
69*9880d681SAndroid Build Coastguard Worker       return std::move(Obj);
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker     ErrorOr<MemoryBufferRef> BCData =
72*9880d681SAndroid Build Coastguard Worker         IRObjectFile::findBitcodeInObject(*Obj->get());
73*9880d681SAndroid Build Coastguard Worker     if (!BCData)
74*9880d681SAndroid Build Coastguard Worker       return std::move(Obj);
75*9880d681SAndroid Build Coastguard Worker 
76*9880d681SAndroid Build Coastguard Worker     return errorOrToExpected(IRObjectFile::create(
77*9880d681SAndroid Build Coastguard Worker                                  MemoryBufferRef(BCData->getBuffer(),
78*9880d681SAndroid Build Coastguard Worker                                  Object.getBufferIdentifier()), *Context));
79*9880d681SAndroid Build Coastguard Worker   }
80*9880d681SAndroid Build Coastguard Worker   }
81*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unexpected Binary File Type");
82*9880d681SAndroid Build Coastguard Worker }
83