Nikita Popov ec1ea0a4ca
[llvm-c] Deprecate functions working on the global context (#163979)
One of the most common mistakes when working with the LLVM C API is to
mix functions that work on the global context and those that work on an
explicit context. This often results in seemingly nonsensical errors
because types from different contexts are mixed.

We have considered the APIs working on the global context to be obsolete
for a long time already, and do not add any new APIs using the global
context. However, the fact that these still exist (and have shorter
names) continues to cause issues.

This PR proposes to deprecate these APIs, with intent to remove them at
some point in the future.

RFC:
https://discourse.llvm.org/t/rfc-deprecate-c-api-functions-using-the-global-context/88639
2025-12-08 08:29:48 +00:00

100 lines
3.2 KiB
C

/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\
|* *|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
|* Exceptions. *|
|* See https://llvm.org/LICENSE.txt for license information. *|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
|* *|
|*===----------------------------------------------------------------------===*|
|* *|
|* This file implements the --object-list-sections and --object-list-symbols *|
|* commands in llvm-c-test. *|
|* *|
\*===----------------------------------------------------------------------===*/
#include "llvm-c-test.h"
#include "llvm-c/Object.h"
#include <stdio.h>
#include <stdlib.h>
int llvm_object_list_sections(void) {
LLVMMemoryBufferRef MB;
LLVMSectionIteratorRef sect;
char *outBufferErr = NULL;
if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
fprintf(stderr, "Error reading file: %s\n", outBufferErr);
free(outBufferErr);
exit(1);
}
char *outBinaryErr = NULL;
LLVMContextRef C = LLVMContextCreate();
LLVMBinaryRef O = LLVMCreateBinary(MB, C, &outBinaryErr);
if (!O || outBinaryErr) {
fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
free(outBinaryErr);
exit(1);
}
sect = LLVMObjectFileCopySectionIterator(O);
while (sect && !LLVMObjectFileIsSectionIteratorAtEnd(O, sect)) {
printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect),
LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect));
LLVMMoveToNextSection(sect);
}
LLVMDisposeSectionIterator(sect);
LLVMDisposeBinary(O);
LLVMDisposeMemoryBuffer(MB);
LLVMContextDispose(C);
return 0;
}
int llvm_object_list_symbols(void) {
LLVMMemoryBufferRef MB;
LLVMSectionIteratorRef sect;
LLVMSymbolIteratorRef sym;
char *outBufferErr = NULL;
if (LLVMCreateMemoryBufferWithSTDIN(&MB, &outBufferErr)) {
fprintf(stderr, "Error reading file: %s\n", outBufferErr);
free(outBufferErr);
exit(1);
}
char *outBinaryErr = NULL;
LLVMContextRef C = LLVMContextCreate();
LLVMBinaryRef O = LLVMCreateBinary(MB, C, &outBinaryErr);
if (!O || outBinaryErr) {
fprintf(stderr, "Error reading object: %s\n", outBinaryErr);
free(outBinaryErr);
exit(1);
}
sect = LLVMObjectFileCopySectionIterator(O);
sym = LLVMObjectFileCopySymbolIterator(O);
while (sect && sym && !LLVMObjectFileIsSymbolIteratorAtEnd(O, sym)) {
LLVMMoveToContainingSection(sect, sym);
printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
LLVMGetSectionName(sect));
LLVMMoveToNextSymbol(sym);
}
LLVMDisposeSymbolIterator(sym);
LLVMDisposeBinary(O);
LLVMDisposeMemoryBuffer(MB);
LLVMContextDispose(C);
return 0;
}